很简单的深搜..虽然时间很长281MS.
#include<stdio.h>
#include<math.h>
#include<string.h>
int digit[21]; //存储数字
int status[21]; //代表当前数字的状态
int n;
int judge(int sum)
{
int k=(int)sqrt((double)sum);
int i;
for(i=2;i<=k+1;i++)
if(sum%i==0)return 0;
return 1;
}
void dfs(int total,int index)
{
int i;
digit[total]=index;
status[index]=1;
if(total==n)
{
if(judge(digit[total]+digit[1]))
{
for(i=1;i<n;i++)
printf("%d ",digit[i]);
printf("%d\n",digit[total]);
return ;
}
}
for(i=2;i<=n;i++)
{
if(!status[i]&&judge(digit[total]+i))
{
status[i]=1;
dfs(total+1,i);
status[i]=0;
}
}
}
int main()
{
int i=1;
while(scanf("%d",&n)!=EOF)
{
memset(status,0,sizeof(status));
printf("Case %d:\n",i);
dfs(1,1);
printf("\n");
i++;
}
return 0;
}