HDOJ搜索专题之Prime Ring Problem

经典的DFS,素数环问题。

题目大意:将从1开始的前n个自然数排成一个圈,使得任意相邻的两个数的和是素数。给定n,按字典序打印结果。

View Code
 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N 20
 4 int a[N],n,cnt;
 5 char is_p[40],vis[N];
 6 void init()
 7 {
 8   memset(is_p,0,sizeof(is_p));
 9   is_p[2]=1;
10   is_p[3]=1;
11   is_p[5]=1;
12   is_p[7]=1;
13   is_p[11]=1;
14   is_p[13]=1;
15   is_p[17]=1;
16   is_p[19]=1;
17   is_p[23]=1;
18   is_p[29]=1;
19   is_p[31]=1;
20   is_p[37]=1;
21   
22   memset(vis,0,sizeof(vis));
23   cnt=0;
24   vis[1]=1;
25   a[0]=1;
26 }
27 void print()
28 {
29   for(int i=0;i<n-1;i++)  printf("%d ",a[i]);
30   printf("%d\n",a[n-1]);
31 }
32 void dfs(int cnt)
33 {
34   if(cnt==n)
35   {
36     if(is_p[1+a[cnt-1]])
37       print();
38     return;
39   }
40   for(int i=2;i<=n;i++)
41   {
42     if(vis[i] || !is_p[i+a[cnt-1]])  continue;
43     vis[i]=1;
44     a[cnt]=i;
45     dfs(cnt+1);
46     vis[i]=0;
47   }
48 }
49 int main()
50 {
51   int kase=0;
52   while(~scanf("%d",&n))
53   {
54     init();
55     printf("Case %d:\n",++kase);
56     dfs(1);
57     printf("\n");
58   }
59   return 0;
60 }

 

posted @ 2012-05-16 19:25  BeatLJ  阅读(175)  评论(0编辑  收藏  举报