HDU 1016.Prime Ring Problem【DFS(递归)】【素数打表】【8月17】

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.

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
  
  
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所有的n个数组成环,使相邻两个相加都是素数。DFS深搜一遍,合法就输出。具体看代码。代码如下:

#include<cstdio>
#include<cstring>
int f[25],sh[45]={0},l[25],n,kase=0;//f[i]记录i是否已用,l[i]记录合法的环
void DFS(int num,int sol){//num是前一个数字,sol是位置
    if(sol==n&&!sh[num+1]){//1就是那个起始数字
        for(int i=0;i<n;i++){
            if(i!=0) printf(" ");//注意输出格式
            printf("%d",l[i]);
        }
        printf("\n");
    }
    for(int i=1;i<=n;i++)
    if(!f[i]&&!sh[num+i]){
        f[i]=1;//标记已用
        l[sol]=i;
        DFS(i,sol+1);
        f[i]=0;//回溯
    }
}
int main(){
    sh[1]=1;
    for(int i=2;i<22;i++)//筛选法打表,素数用0标记
    for(int j=i+i;j<45;j+=i)
        sh[j]=1;//非素数用1标记
    while(scanf("%d",&n)!=EOF){
        printf("Case %d:\n",++kase);
        memset(f,0,sizeof(f));
        memset(l,0,sizeof(l));
        l[0]=1;//起始位置是1
        f[1]=1;//1用过了
        DFS(1,1);
        printf("\n");
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值