Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 21151 Accepted Submission(s): 9465
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
Source
Asia 1996, Shanghai (Mainland China)
深度搜索....无压力;;
代码:
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4 int str[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
5 int ans[21]={1};
6 int n,cnt; /*代表搜索的深度*/
7 bool flag;
8 /*可能需要剪枝*/
9 void dfs(int step)
10 {
11 int i,j,temp;
12 if(step==n) /*说明搜索到底了!*/
13 {
14 flag=true;
15 temp=ans[0]+ans[n-1]; //开头和结尾也要判断
16 for(j=2;j*j<=temp;j++)
17 {
18 if(temp%j==0)
19 {
20 flag=false;
21 break;
22 }
23 }
24 if(flag)
25 {
26 printf("%d",ans[0]);
27 for( i=1;i<n;i++)
28 {
29 printf(" %d",ans[i]);
30 }
31 puts("");
32 }
33 }
34 else
35 {
36 for(i=1;i<n;i++)
37 {
38 if(str[i])
39 {
40 flag=true;
41 temp=ans[cnt-1]+str[i];
42 for(j=2;j*j<=temp;j++)
43 {
44 if(temp%j==0)
45 {
46 flag=false;
47 break;
48 }
49 }
50 if(flag)
51 {
52 ans[cnt++]=str[i];
53 str[i]=0;
54 dfs(step+1);
55 str[i]=ans[--cnt];
56 ans[cnt]=0;
57 }
58 }
59 }
60 }
61 }
62
63 int main()
64 {
65 int count=1;
66 while(scanf("%d",&n)!=EOF)
67 {
68 cnt=1;
69 printf("Case %d:\n",count++);
70 dfs(1);
71 puts("");
72 }
73 return 0;
74 }