题目链接:
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,所以只要打到40int 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;}
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦