标签:
Description
A ring is composed of n (even number) circles as shown in diagram. Put natural numbers into each circle separately, and the sum of numbers in two adjacent circles should be a prime.
Note: the number of first circle should always be 1.
You are to write a program that completes above process.
6 8
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
题目大意:使1~n这些数组成环,并且两两相加要是素数,输出所有的解。
解题思路:第一个数总是1,直接用DFS从第二数开始遍历,遍历到底部不满足,回溯到上一个个节点,知道遍历完所有的可行解。
代码:
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 const int maxn=50+5; 5 int a[maxn],b[maxn],d[maxn],n,i,j; 6 int sushu(int x) 7 { 8 for(i=2;i*i<=x;i++) 9 if(x%i==0) 10 return 0; 11 return 1; 12 } 13 void dfs(int cur) 14 { 15 if(cur==n&&d[a[0]+a[cur-1]]) 16 { 17 cout<<a[0]; 18 for(int i=1;i<n;i++) 19 cout<<" "<<a[i]; 20 cout<<endl; 21 } 22 else 23 { 24 for(int i=2;i<=n;i++) 25 { 26 if(!b[i]&&d[i+a[cur-1]]) 27 { 28 a[cur]=i; 29 b[i]=1; 30 dfs(cur+1); 31 b[i]=0; 32 } 33 } 34 } 35 } 36 int main() 37 { 38 int p=0,t=0; 39 while(cin>>n&&n) 40 { 41 if(p++) 42 cout<<endl; 43 cout<<"Case "<<++t<<":"<<endl; 44 45 memset(a,0,sizeof(a)); 46 memset(d,0,sizeof(d)); 47 for(j=2;j<n*2;j++) 48 d[j]=sushu(j); 49 memset(b,0,sizeof(b)); 50 a[0]=1; 51 dfs(1); 52 } 53 return 0; 54 }
标签:
原文地址:http://www.cnblogs.com/huaxiangdehenji/p/4694190.html