素数环,暴力剪枝

Posted coolwx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了素数环,暴力剪枝相关的知识,希望对你有一定的参考价值。

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.

技术图片

Inputn (0 < n < 20).
OutputThe 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.

 

剪枝还是很暴力的,学到了

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <set>
 4 #include <cmath>
 5 #include <cstring>
 6 using namespace std;
 7 set<int> prime;
 8 int record[23];
 9 bool is[23];
10 void dfs(int now,int n)
11 
12     if(now==n-1&&prime.find(1+record[n-1])!=prime.end())
13     
14         for(int i=0;i<n-1;i++)
15         printf("%d ",record[i]);
16         printf("%d",record[n-1]);
17         printf("\n");
18         return;
19     
20     else
21     
22         if(record[now]%2==1)
23         
24             for(int i=2;i<=n;i+=2)
25             
26                 if(is[i]==false&&prime.find(i+record[now])!=prime.end())
27                 
28                     record[now+1]=i;
29                     is[i]=true;
30                     dfs(now+1,n);
31                     is[i]=false;
32                 
33             
34         
35         
36         if(record[now]%2==0)
37         
38             for(int i=1;i<=n;i+=2)
39             
40                 if(is[i]==false&&prime.find(i+record[now])!=prime.end())
41                 
42                     record[now+1]=i;
43                     is[i]=true;
44                     dfs(now+1,n);
45                     is[i]=false;
46                 
47             
48         
49     
50 
51 int main()
52 
53     for(int i=2;i<=42;i++)
54     
55         int flag=0;
56         for(int j=2;j<=sqrt(i);j++)
57         
58             if(i%j==0)
59             
60                 flag=1;
61                 break;
62             
63         
64         if(flag==0)
65         
66         prime.insert(i);
67     
68     int mm=0;
69     int n;
70     while(scanf("%d",&n)!=EOF)
71     
72         mm++;
73         printf("Case %d:\n",mm);
74         if(n%2==1)
75         
76             printf("\n\n");
77         
78         else
79         
80            record[0]=1;
81            is[1]=true;    
82            dfs(0,n);
83            printf("\n");
84         
85         
86     
87 

 

以上是关于素数环,暴力剪枝的主要内容,如果未能解决你的问题,请参考以下文章

浅谈搜索剪枝

USACO ariprog 暴力枚举+剪枝

hdu 4542 "小明系列故事——未知剩余系" (反素数+DFS剪枝)

python 井字棋 ALPHA-BETA剪枝算法和暴力算法 具体代码

ZOJ Seven-Segment Display 暴力dfs + 剪枝

Codeforces Round #544 (Div. 3) C. Balanced Team [暴力剪枝]