题目描述
给定一个N(1<=N<=10),求1——N组成的环,使得环上相邻的元素和为素数。
输入描述
一个整数N
输出描述
把1放在第一位置,按照字典顺序不重复地输出所有解(顺时针,逆时针算不同的两种),相邻两数之间严格用一个空格隔开,每一行的末尾不能有多余的空格。如果无解,则输出“no”。
样例输入
8
样例输出
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
Solution
运用DFS,代码中会详细解释。
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> using namespace std; int n,a[15]= {0}; bool used[15]= {0},flag=0; bool chk_prime(int a) { if(a==2) return 1; if(a==1) return 0; if(a==0) return 0; for(int i=2; i<=sqrt(a); i++) { if(a%i==0) return 0; } return 1; } bool chk() { int p=0; for(int i=1; i<=n-1; i++) { if(chk_prime(a[i]+a[i+1])==1) { p++; } } if(chk_prime(a[n]+a[1])==1) p++; if(p==n) return 1; else return 0; } void print() { for(int i=1; i<=n-1; i++) { printf("%d ",a[i]); } printf("%d\n",a[n]); flag=1; } void dfs(int i) {
for(int j=2; j<=n; j++) { if(used[j]==0) { a[i]=j; used[j]=1; if(i==n) { if(chk()==1) { print(); } } else dfs(i+1); used[j]=0; a[i]=0; } } } int main() { cin>>n; a[1]=1; used[1]=1; dfs(2); if(flag==0){ cout<<"no"; } return 0; }
|