您的位置:首页 > 其它

1020Prime Ring Problem

2016-04-24 17:11 447 查看
[align=left]Problem Description[/align]
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>
 

[align=left]Input[/align]
n (0 < n < 20).<br>
 

[align=left]Output[/align]
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>
 

[align=left]Sample Input[/align]

6<br>8<br>

 

[align=left]Sample Output[/align]

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>

 

[align=left]Source[/align]
Asia 1996, Shanghai (Mainland China)
 
简单题意:

  一个由图组成的圆环,把自然数放在环中,两个临近的环的和是一个素数,并且第一个环的值总为1.现在需要编写一个程序,使得数字的顺序必须满足上述的要求。

解题思路形成过程:

  Dfs更多的是表示一种状态,如果不成功,则回溯到上一个状态。由DFS算法可以很轻松地完成问题。

AC代码:

#include <iostream>

#include<cstdio>

#include<cmath>

int a[25];

bool use[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 num){

    int i;

    if(n==num&&isprime(1+a[n-1])){

        for(i=0;i<n;i++){

            printf(i==n-1?"%d\n":"%d ",a[i]);

        }

    }

    else{

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

            if(!use[i]&&isprime(i+a[num-1])){

                a[num]=i;

                use[i]=true;

                DFS(num+1);

                use[i]=false;

            }

        }

    }

}

void init(){

    int i;

    for(i=0;i<n;i++){

        use[i]=false;

    }

    a[0]=1;

}

int main(){

    int t=0;

    while(scanf("%d",&n)!=EOF){

        init();

        printf("Case %d:\n",++t);

        DFS(1);

        puts("");

    }

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