杭电(hdu)1016 Prime Ring Problem

来源:互联网 发布:淘宝如何发放优惠券 编辑:程序博客网 时间:2024/05/17 06:40

Prime Ring Problem

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 34447    Accepted Submission(s): 15240


Problem 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
 
经典的深度优先搜索问题。
代码如下:
#include <iostream>#include <string>#include <cstdio>#include <cstring>using namespace std;int a[21];int v[21];int count=0;int n;int findprime(int y){    int flag=0;    for(int i=2;i<=y/2;i++)    {        if(y%i==0)        {            flag=1;            break;        }    }    if(flag==0)return 1;    else return 0;}void dfs(int x){    if(x==n&&findprime(a[x]+a[1])&&findprime(a[x]+a[x-1]))    {        cout<<a[1];        for(int i=2;i<=n;i++)        {            cout<<" "<<a[i];        }         cout<<endl;    }    for(int i=2;i<=n;i++)    {        if(v[i]==0&&findprime(i+a[x]))        {            v[i]=1;            a[x+1]=i;            dfs(x+1);            v[i]=0;        }    }}int main(){    while(cin>>n)    {        count++;        memset(v,0,sizeof(v));        a[1]=1;        v[1]=1;        cout<<"Case "<<count<<":"<<endl;        dfs(1);        cout<<endl;    }    return 0;} 

0 0