HDU 1016.Prime Ring Problem【DFS(递归)】【素数击表】【8月17】
HDU 1016.Prime Ring Problem【DFS(递归)】【素数打表】【8月17】
给定n,1~n所有的n个数组成环,使相邻两个相加都是素数。DFS深搜一遍,合法就输出。具体看代码。代码如下:

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.

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.
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
#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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。