B
来源:互联网 发布:ubuntu skype登录闪退 编辑:程序博客网 时间:2024/04/29 20:41
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.
You are to write a program that completes above process.
Print a blank line after each case.
68
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
在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'); }}