题意:本题题意就是构成一个素数环。即相邻两数之和要为素数。环的元素个数在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
AC代码:
#include <iostream> #include <cstring> #include <string> #include <cstdio> #include <cmath> using namespace std; int a[12]={2,3,5,7,11,13,17,19,23,29,31,37},b[40]={0},c[22]={0},d[22]={0},n,t=1; int dfs(int k) { int i; if(k==n+1&&b[c[n]+c[1]]==1) { for(i=1;i<=n;i++) { if(i==1) printf("%d",c[1]); else printf(" %d",c[i]); } printf(" "); return 0; } else { for(i=1;i<=n;i++) { if(d[i]!=0&&b[c[k-1]+d[i]]==1) { d[i]=0;c[k]=i; dfs(++k); d[i]=i;c[k]=0;k--; } } } return 0; } int main() { int i; while(scanf("%d",&n)!=EOF) { for(i=0;i<12;i++) b[a[i]]=1; d[1]=0;c[1]=1; for(i=2;i<=n;i++) d[i]=i; printf("Case %d: ",t++); dfs(2); printf(" "); } return 0; }
草稿代码:
/*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 ",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 ",t); if(t==0&&nu[b[1]+b[n]]==1) { for(i=0;i<n-1;i++) printf("%d ",b[i+1]); printf("%d ",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- ",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; }
//全部搜索后符合题意的输出,然后回退一步,在回退一部,直到回到第一步,并且第一步全部循环了
//核心思想,回退的时候所有状态都还原