生活随笔
收集整理的這篇文章主要介紹了
HDOJ1016 素数环(DFS)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
題目:
1 /*
2 素數環(順時針逆時針)---dfs
3 使用棧
4 1-n(n最大是20,相鄰最大和39,素數范圍2-39之間)
5 2-39間的素數:
6 2,3,5,7,11,13,17,19,23,29,31,37
7 從1開始,逐個嘗試,如果是素數,入棧,否則嘗試下一個,直到全部嘗試完;
8 如果n個數全部入棧了,輸出一組解(n最大為20,輸出棧可以使用遞歸),
9 第一個數始終是1,第二個數需要嘗試n+1的時候,就表示結束了(next = -1)。
10 */
11 #include <cstdio>
12 #include <iostream>
13 #include <stack>
14 using namespace std;
15
16 #define N 22
17 //全局變量
18 int prime[
40];
19 int arr[N];
20 stack<
int>
s;
21
22 //函數
23 void InitPrime();
24 void InitArr(
int n);
25 void dfs(
int n);
26 int GetNext(
int b,
int n);
27 void Output(
int n);
28 //main
29 void main()
30 {
31 int n;
32 InitPrime();
33 while (scanf(
"%d",&n)!=
EOF)
34 {
35 InitArr(n);
36 dfs(n);
37 }
38 }
39
40 void InitPrime()
41 {
42 for (
int i=
0;i<
40;i++
)
43 {
44 switch(i)
//本題數量不多,就直接這樣寫啦,如果數量多可以用【篩選法】或者【試除法】
45 {
46 case 2:
case 3:
case 5:
47 case 7:
case 11:
case 13:
48 case 17:
case 19:
case 23:
49 case 29:
case 31:
case 37:
50 prime[i] =
1;
51 break;
52 default:
53 prime[i] =
0;
54 }
55 }
56 }
57
58 void InitArr(
int n)
59 {
60 for (
int i=
1; i<=n ; i++
)
61 {
62 arr[i] =
0;
63 }
64 }
65 void dfs(
int n)
66 {
67 int flag,next,b,idx;
68 s.push(
1);
69 arr[
1] =
1;
70 flag =
1;
71 idx =
1;
//從idx開始尋找匹配數字
72 while (flag)
73 {
74 b =
s.top();
75 next =
GetNext(idx,n);
76 if (next == -
1)
//嘗試結束,回溯
77 {
78 if (b ==
1 && next == -
1)
//over
79 {
80 flag =
0;
81 }
82 idx =
s.top();
83 s.pop();
84 arr[idx] =
0;
85 continue;
86 }
87 if (prime[next+b] ==
1)
//匹配成功,next入棧,idx化為2
88 {
89 arr[next] =
1;
90 s.push(next);
91 idx =
1;
92 //全部入棧則輸出
93 if (s.size() == n && prime[
1+s.top()] ==
1)
//既要順時針為素數環又要逆時針為素數環
94 {
95 Output(n);
96 cout<<
endl;
97 idx =
s.top();
98 s.pop();
99 arr[idx] =
0;
100 }
101 continue;
102 }
103 //匹配失敗,idx化為next
104 idx =
next;
105 }
106
107 }
108 int GetNext(
int b,
int n)
109 {
110 for (
int i=b+
1;i<=n;i++
)
111 {
112 if (arr[i]!=
1)
113 return i;
114 }
115 return -
1;
//全部嘗試完返回-1
116 }
117 void Output(
int n)
118 {
119 int cur;
120 if (n!=
0)
121 {
122 cur =
s.top();
123 s.pop();
124 Output(n-
1);
125 cout<<cur<<
' ';
126 s.push(cur);
//還要加回去
127 }
128 }
?
總結
以上是生活随笔為你收集整理的HDOJ1016 素数环(DFS)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。