题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016
#include<stdio.h>
#include<string.h>
int a[25];//a[i]来表示第i个位置放数字a[i]
int vis[25];//vis[i]记录数字i是否被放置好
int n;
bool is_prime(int k,int l)//判断质数
{
int s=k+l;
for(int i=2; i*i<=s; i++)
{
if(s%i==0)
return 0;
}
return 1;
}
void dfs(int n,int num)
{
if((num==n)&&is_prime(a[n-1],a[0]))//表示已经搜索到n-1的下一个位置(注意是从位置0开始的),即n个数都放置好了,且最后一个数与第一个数相加也是质数
{
for(int i=0; i<n-1; i++)
printf("%d ",a[i]);
printf("%d\n",a[n-1]);
}
else
{
for(int i=2; i<=n; i++)
{
if((vis[i]==0)&&is_prime(i,a[num-1]))//如果符合条件
{
vis[i]=1;//数字i放进去,做标记
a[num]=i;//位置num放数字i
dfs(n,num+1);//继续搜索下一个位置
vis[i]=0;//清空标记
}
}
}
}
int main()
{
int cas=1;
while(~scanf("%d",&n))
{
printf("Case %d:\n",cas++);
memset(vis,0,sizeof(vis));
a[0]=1;//题目规定,位置0一定要是1
vis[1]=1;//数字1已被放置好
dfs(n,1);
printf("\n");
}
return 0;
}