A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n 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 < 20).
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. Print solutions in lexicographical order.
You are to write a program that completes above process.
Print a blank line after each case.
Sample Input
Sample Output
Note: the number of first circle should always be 1.
Input
You are to write a program that completes above process.
Print a blank line after each case.
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
在dfs中递归时,单独的return就是表示此情况不通,原路返回,返回上一层;
#include<cstdio> #include<queue> #include<vector> #include<iostream> #include<cstring> #include<cmath> #include<map> using namespace std; int pr[50],a[22],flag[22],n; void sushu() { for(int i=2;i<sqrt(50);i++) { if(pr[i]==0) { for(int j=i*i;j<=50;j+=i)pr[j]=-1; } } } void dfs(int k) { if(k>n) { if(pr[a[n]+1]==0) { printf("%d",a[1]); for(int i=2;i<=n;i++)printf(" %d",a[i]); putchar('\n'); } else return; } for(int i=2;i<=n;i++) { if(!flag[i]&&!pr[a[k-1]+i]) { a[k]=i;flag[i]=1;dfs(k+1);flag[i]=0; } } return; } int main() { memset(pr,0,sizeof(pr)); sushu(); int k=1; while(cin>>n) { printf("Case %d:\n",k++); memset(flag,0,sizeof(flag));a[1]=1;flag[1]=1; dfs(2); putchar('\n'); } }