HDU-1016素数环
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU-1016素数环相关的知识,希望对你有一定的参考价值。
题意:本题题意就是构成一个素数环。即相邻两数之和要为素数。环的元素个数在1到20之间。
素数-只能被1和它本身整除的数
输入6就是1-6排成一个相邻数相加是素数;环,第一个和最后一个加起来也要是素数
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
/*su shu huan*/ #include <iostream> #include <stdio.h> #include <string.h> #include <math.h> int a[22],n,b[22]={1},k; int num[12] = {2,3,5,7,11,13,17,19,23,29,31,37},nu[40]; int dfs2(int m) { int i; if(m==n+1&&nu[b[1]+b[n]]==1) { for(i=1;i<n;i++) printf("%d ",b[i]); printf("%d\n",b[n]); } else { for(i=2;i<=n;i++) { if(a[i]==1&&nu[i+b[m-1]]) { //m++; b[m++]=i; a[i]=0; dfs2(m); a[i]=1; m--; } } } return 0; } int dfs(int m) { int t=0,i; for(i=1;i<=n;i++) { if(a[i]==1) { t=1;break; //printf("-A-");break; } } //printf("t=%d\n",t); if(t==0&&nu[b[1]+b[n]]==1) { for(i=0;i<n-1;i++) printf("%d ",b[i+1]); printf("%d\n",b[n]); } if(t==0) { for(i=2;i<=n;i++) b[i]=0; k=1;b[1]=1; return 0; } for(i=2;i<=n;i++) { if(a[i]==1&&nu[i+m]==1) {printf("-%d-\n",i); a[i]=0; b[++k]=i; dfs(i); a[i]=1; b[k]=0; k--; } } for(i=2;i<=n;i++) b[i]=0; k=1;b[1]=1; return 0; } int main() { int i; k=1;b[1]=1; for(i=0;i<12;i++) nu[num[i]]=1; scanf("%d",&n); for(i=2;i<=n;i++) a[i]=1; a[1]=0;b[1]=1; dfs2(2); return 0; }
//全部搜索后符合题意的输出,然后回退一步,在回退一部,直到回到第一步,并且第一步全部循环了
//核心思想,回退的时候所有状态都还原
以上是关于HDU-1016素数环的主要内容,如果未能解决你的问题,请参考以下文章