题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1016
题目描述:
输出满足相邻的相加是素数的序列(注意不要重复)
解题思路:
类似于一些数字全排列的搜索,也就算是暴力深搜吧。
不重复的话,用一个状态flag记录下i是否被用过即可
#include<stdio.h>
#include<string.h>
int Z_nPrime[40]={0,1,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0};//素数打表,因为n最大是20,所以只要打到40
int Z_nflag[21],V_nQueue[21];
int n;
void dfs(int count)//深搜
{
int i;
if(count==n&&Z_nPrime[V_nQueue[count-1]+V_nQueue[0]]) //满足条件了,就输出来
{
for(i=0;i<count-1;i++)
printf("%d ",V_nQueue[i]);
printf("%d\n",V_nQueue[count-1]);
}
else
{
for(i=2;i<=n;i++)
{
if(!Z_nflag[i])//是否用过了
{
if(Z_nPrime[i+V_nQueue[count-1]]) //是否和相邻的加起来是素数
{
Z_nflag[i]=-1;//标记了
V_nQueue[count++]=i;//放进数组
dfs(count); //递归调用
Z_nflag[i]=0; //退去标记
count--;
}
}
}
}
}
int main()
{
int num=0;
while(scanf("%d",&n)!=EOF)
{
num++;
printf("Case %d:\n",num);
memset(Z_nflag,0,sizeof(Z_nflag));
V_nQueue[0]=1;
dfs(1);
printf("\n");
}
return 0;
}