Q

来源:互联网 发布:eia原油库存数据直播 编辑:程序博客网 时间:2024/04/27 18:48

Description

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
 

题意:

n个数从1到n,构成一个环形,保证相邻的两个数和为素数,找到所有的可能

分析:

其实用dfs就可以,要特殊处理第一个数和第n个数

代码:

#include<iostream>#include<cstring>#include<string>using namespace std;int a[25],b[25],n,ss[40];void dfs(int k){    int i,j;    if(k==n){        if(ss[a[k]+a[1]]==0)        {            for(j=1;j<n;j++)            cout<<a[j]<<" ";            cout<<a[n]<<endl;        }        return;    }    for(i=2;i<=n;i++)    {        if(b[i]==0)        {            if(ss[i+a[k]]==0&&k<n){                b[i]=1;                a[k+1]=i;                dfs(k+1);            }            b[i]=0;        }    }}int main(){    int i,j;    ss[1]=1;    a[1]=1;    for(i=2;i<40;i++)    {        if(ss[i]==0)        {            for(j=i+1;j<40;j++)            if(j%i==0)            ss[j]=1;        }    }    i=1;    while(cin>>n&&n)    {        memset(b,0,sizeof(b));        cout<<"Case "<<i<<":"<<endl;        if(n==1)cout<<1<<endl;        else        dfs(1);        cout<<endl;        i++;    }}

感受:

挺简单的,只不过要注意输出形式,不然容易多空格

原创粉丝点击