HDUOJ----(1016)Prime Ring Problem

Prime Ring Problem

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
深度搜索....无压力;;
代码:
 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 }
View Code

 

你可能感兴趣的:(Prim)