標籤:
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.
Input
n (0 < n <= 16)
Output The output format is shown as sample below. Each row represents a series of circle numbers in the ring beginning from 1 clockwisely and anticlockwisely. The order of numbers must satisfy the above requirements.
You are to write a program that completes above process.
Sample Input
68
Sample Output
Case 1:1 4 3 2 5 61 6 5 2 3 4Case 2:1 2 3 8 5 6 7 41 2 5 8 3 4 7 61 4 7 6 5 8 3 21 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 else23 {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 }
HUAS Summer Trainning #3 C