ZOJ1457 || HDU1016 素数环
思路很简单,简单的素数环,相邻位必定是一奇一偶,当n为奇数时就不必在判断了,输出肯定木有素数环(剪枝的重要判定条件),
因为n为奇数时奇数的数量一定大于偶数的数量,最后一定存在两个奇数相连(雀巢原理)。
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4 #include<math.h>
5
6 int A[20],visit[20],ok,n;
7 int isp[40]={0,1,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,1};//把素数的情况提前放在数组里,也可以写一个奇数
8 判断函数不过去哦有点懒不想写。
9 void dfs(int cur)
10 {
11 int i;
12 if(cur==n && isp[A[0]+A[n-1]] && isp[A[n-1]+A[n-2]])
13 {
14 for(i=0; i<n; i++)
15 {
16 if(i==n-1)
17 printf("%d",A[i]);
18 else
19 printf("%d ",A[i]);
20 }
21 ok = 1;
22 printf("\n");
23 }
24 else
25 {
26 for(i=2; i<=n; i++)
27 {
28 if(!visit[i] && isp[i+A[cur-1]])
29 {
30 A[cur] = i;
31 visit[i] = 1;
32 dfs(cur+1);
33 visit[i] = 0;
34 A[cur] = 0;
35 }
36 }
37 }
38 }
39
40 int main()
41 {
42 int i=1,j;
43
44 while(scanf("%d",&n)!=EOF)
45 {
46 if(n == 0)
47 break;
48 printf("Case %d:\n", i++);
49 memset(visit,0,sizeof(visit));
50 for(j=0; j<n; j++)
51 A[j] = j+1;
52 visit[1] =1;
53 if(n%2 == 0)
54 dfs(1);
55 // else
56 // printf("No Answer\n");
57 printf("\n");
58 }
59 return 0;
60 }
61
此题已开始纠结了很久原因在于输出的控制
木有把握好,杭电上的测试数据貌似不够精确,同样的代码在杭电上跑171ms,可到了ZOJ却是390ms