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
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  
在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');   }}