Prime Ring Problem

来源:互联网 发布:linux 黑客工具 编辑:程序博客网 时间:2024/05/21 13:24

Prime Ring Problem

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


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
 

Source
Asia 1996, Shanghai (Mainland China)
题目意思:输入一个正整数n,要求输出由1-n所组成的素数环的所有可能.
利用dfs来尝试每一种可能,行不通的时候回溯,直到找出所有的解.
#include <iostream>#include <cstring>#include <cmath>#include <stdio.h>using namespace std;int a[25],book[25];int n;bool isprime(int num){    int i;    for(i=2; i<=sqrt(num+0.0); i++)    {        if(num%i==0)            return false;    }    return true;}void dfs(int step){    if(step==n&&isprime(1+a[n-1]))    {        for(int i=0; i<n-1; i++)        {            cout<<a[i]<<" ";        }        cout<<a[n-1];        cout<<endl;    }    else    {        for(int i=2; i<=n; i++)        {            if(book[i]==0&&isprime(i+a[step-1]))            {                a[step]=i;                book[i]=1;                dfs(step+1);                book[i]=0;            }        }    }}int main(){    int test=0;    while(scanf("%d",&n)!=EOF)    {        test++;        memset(book,0,sizeof(book));        a[0]=1;        cout<<"Case "<<test<<":"<<endl;        dfs(1);        cout<<endl;    }    return 0;}


0 0