您的位置:首页 > 其它

UVA 524 / hdu 1016 Prime Ring Problem

2016-02-17 14:41 204 查看
 杭电链接:点击打开链接




                                                                                              Prime Ring Problem

A ring is composed of n (even number) circles as shown in diagram. Put natural numbers


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 <= 16)

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.

You are to write a program that completes above process.

Sample Input 

6
8

Sample Output 

Case 1:
1 4 3 2 5 6
1 6 5 2 3 4

Case 2:
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2

题意:给n个数,把1到n组成一个如上图所示的素数环:顾名思义,就是在该环中,任意两个相邻的数之和为素数

题解:用深搜一个个搜索,题目规定是从1 开始,所以由1开始,在1----n-1个数时只需要两个相邻的数之和为素数,重点就在最后一个数,要考虑它和上一个数之和是否
是素数,还要考虑它和1 之和是否是素数,两者都符合的就可以组成一个素数环啦。

代码展示:

#include<iostream>

#include<cstring>

using namespace std;

int prim[40] = {0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,1};

int sign[22],flag[22];

int n;

void dfs(int s)

{

    int i;

    if(s > n) return;

    if(s == n)

    {

        for(i = 0;i < n-1;i++)

            cout<<flag[i]<<" ";

        cout<<flag[n-1]<<endl;

        return;

    }

    for(i = 2;i <= n;i++)

    {

        if(sign[i] == 1) continue;

        if(s+1 == n)

        {

            if(prim[i+1] == 1 && prim[flag[s-1] + i] == 1)

            {

                flag[s] = i;

                sign[i] = 1;

                dfs(s+1);

                sign[i] = 0;

            }

        }

        else

        {

            if(prim[i+flag[s-1]] == 1)

            {

                flag[s] = i;

                sign[i] = 1;

                dfs(s+1);

                sign[i] = 0;

            }

        }

    }

    return;

}

int main()

{

    int m = 1;

    while(cin>>n)

    {

        if(m > 1) cout<<endl;

        memset(sign,0,sizeof(sign));

        memset(flag,0,sizeof(flag));

        sign[0] = 1;

        flag[0] = 1;

        cout<<"Case "<<m++<<":"<<endl;

        dfs(1);

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息