HDU 1016(搜索题,DFS)

Prime Ring Problem

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5720    Accepted Submission(s): 2553

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.

HDU 1016(搜索题,DFS)_第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
此题纠结了我一个晚上。。。太悲剧了~ 一道简单的DFS题而已!
#include <iostream> #include <math.h> using namespace std; #define N 20 int map[N][N],mark[N]; int res[N],p[N]; int n,ct; bool is_prime(int u) { if(u==0 || u==1) return false; if(u==2) return true; if(u%2==0) return false; for(int i=3;i<=sqrt((double)u);i+=2) if(u%i==0) return false; return true; } void init() { int i,j; for(i=1;i<N;i++) { for(j=i+1;j<N;j++) { if(is_prime(i+j)) map[i][j]=map[j][i]=1; } } } void output(int t)//输出例程 { int k=0; while(t)//通过对路径的分析获得结果 { res[k++]=t; t=p[t]; } for(int j=n-1;j>=0;j--)//输出出来 { if(j!=n-1) putchar(' '); printf("%d",res[j]); } putchar('/n'); } void DFS(int x,int count) { mark[x]=1; if(count==n && map[x][1]==1) { output(x); } for (int i=1;i<=n;i++) { if(map[x][i]==1 && mark[i]==0) { p[i]=x; DFS(i,count+1); mark[i]=0; } } } int main() { init(); while (scanf("%d",&n)!=EOF) { ct++; printf("Case %d:/n",ct); DFS(1,1); printf("/n"); } return 0; }

你可能感兴趣的:(HDU 1016(搜索题,DFS))