继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

搜索——素数环(hdu1016)

九日王朝
关注TA
已关注
手记 180
粉丝 42
获赞 185

题目链接:

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;}


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP