首页 > 代码库 > HDU1016 素数环---(dfs)
HDU1016 素数环---(dfs)
http://acm.hdu.edu.cn/showproblem.php?pid=1016
Sample Input
6 8
Sample Output
Case 1:
1 4 3 2 5 6
1 6 5 2 3 4
Case 2:
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2
题意:
输入整数n (0 < n < 20).
找出n个整数,能组成一个环,环中任意相邻两数之和为素数,字典序输出所有情况,每种情况1开头
#include<stdio.h> #include<string.h> int prime[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;//素数打表,因为n最大是20,所以只要打到40 int visited[21],a[21];//visited[]标记数组,a[]存符合条件的序列 定包含1->n 只是需要输出特定顺序的n个数// void dfs(int num)//深搜 { int i; if(num==n&&prime[a[num-1]+a[0]]) //满足条件了,就输出来 然后一步步返回 { for(i=0;i<num-1;i++) printf("%d ",a[i]); printf("%d\n",a[num-1]); } else //num 1->n-1 { for(i=2;i<=n;i++) { if(visited[i]==0)//若未访问 { if(prime[i+a[num-1]]) //是否和相邻的加起来是素数 { visited[i]=-1;//标记了 a[num++]=i;//放进数组 dfs(num); //递归调用 visited[i]=0; //退去标记 num--; } } } } } int main() { int num=0; while(scanf("%d",&n)!=EOF) { num++; printf("Case %d:\n",num); memset(visited,0,sizeof(visited));//标记数组初始化为0 a[0]=1; dfs(1); printf("\n"); } return 0; }
HDU1016 素数环---(dfs)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。