406MS | 12K | 729 B |
用深度优先搜索。
小技巧:
设置一个bool数组:将40以内所有以素数为下标的元素置1
用used数组标记深搜时元素是否访问过
用b数组记录一个解
输入时判断n是否为奇数或者1.
注意:
输出时每个解行后面没有多余的空格。
源代码如下:
#include<stdio.h>
#include<string.h>
bool c[40];
bool used[21];
int b[21];
int n;
void dfs(int t)
{
int i,j;
for(i=2;i<=n;i++)
{
if(used[i]==0&&c[b[t-1]+i]==1)
{
used[i]=1;b[t]=i;
if(t!=n) dfs(t+1);
else if(c[i+1])
{
for(j=1;j<=n-1;j++)
printf("%d ",b[j]);
printf("%d\n",i);
}
used[i]=0;b[t]=0;
}
}
}
int main()
{
int count=0;
memset(c,0,sizeof(c));
c[3]=c[5]=c[7]=c[11]=c[13]=c[17]=c[19]=c[23]=c[29]=c[31]=c[37]=1;
while(scanf("%d",&n)!=EOF)
{
count++;
printf("Case %d:\n",count);
if(n%2!=1&&n!=1)
{
memset(used,0,sizeof(used));memset(b,0,sizeof(b));
b[1]=1;used[1]=1;dfs(2);
}
printf("\n");
}
return 0;
}