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

转载于:https://www.cnblogs.com/cn19901203/archive/2012/03/18/2404293.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值