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

来源:互联网 发布:太平洋软件官方下载 编辑:程序博客网 时间:2024/05/21 22:39

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
68
 

Sample Output
Case 1:1 4 3 2 5 61 6 5 2 3 4Case 2:1 2 3 8 5 6 7 41 2 5 8 3 4 7 61 4 7 6 5 8 3 21 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;}


0 0
原创粉丝点击