您的位置:首页 > 编程语言

2016SDAU编程练习二1020

2016-04-23 15:11 281 查看
Prime Ring Problem 

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.<br><br>Note: the number of first circle should always be 1.<br><br><img src=../../data/images/1016-1.gif><br>

 

Input

n (0 < n < 20).<br>

 

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.<br><br>You
are to write a program that completes above process.<br><br>Print a blank line after each case.<br>

 

Sample Input

6<br>8<br> 

Sample Output

Case 1:<br>1 4 3 2 5 6<br>1 6 5 2 3 4<br><br>Case 2:<br>1 2 3 8 5 6 7 4<br>1 2 5 8 3 4 7 6<br>1 4 7 6 5 8 3 2<br>1 6 7 4 3 8 5 2<br> 

Source

Asia 1996, Shanghai (Mainland China)
 

题意:素数环

思路:DFS,比较好想

感想:代码短的时候就好开心

AC代码:

#include<iostream>

#include<cstdio>

#include<stdio.h>

#include<cstring>

#include<cmath>

using namespace std;

int prime[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,0};

int n,cou;

int num[25];

int vis [25];

int cc[25];

void dfs(int now)

{

    int i;

    if(now==n&&prime[1+cc
])

    {

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

        {

            if(i==1)

                cout<<cc[i];

            else

                cout<<" "<<cc[i];

        }

        cout<<endl;

    }

    else

    {

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

        {

            if(prime[i+cc[now]]&&!vis[i])

            {

                vis[i]=1;

                now++;

                cc[now]=i;

               //cout<<cc[now]<<"  "<<cc[now-1]<<endl;

                dfs(now);

                now--;

                vis[i]=0;

            }

        }

    }

}

int main()

{

    //freopen("r.txt","r",stdin);

    int i,j;

    cou=1;

    while(cin>>n)

    {

        cout<<"Case "<<cou<<":"<<endl;

        num[1]=cc[1]=1;

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

            num[i]=i;

        memset(vis,0,sizeof(vis));

        vis[1]=1;

        dfs(1);

        cou++;

        if(cou!=1)

            cout<<endl;

    }

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