1020Prime 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)
 

简单题意:

  一个由图组成的圆环,把自然数放在环中,两个临近的环的和是一个素数,并且第一个环的值总为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("");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值