日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDOJ1016 素数环(DFS)

發(fā)布時(shí)間:2025/4/16 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDOJ1016 素数环(DFS) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

題目:

1016Prime Ring Problem
1 /* 2 素?cái)?shù)環(huán)(順時(shí)針逆時(shí)針)---dfs 3 使用棧 4 1-n(n最大是20,相鄰最大和39,素?cái)?shù)范圍2-39之間) 5 2-39間的素?cái)?shù): 6 2,3,5,7,11,13,17,19,23,29,31,37 7 從1開始,逐個(gè)嘗試,如果是素?cái)?shù),入棧,否則嘗試下一個(gè),直到全部嘗試完; 8 如果n個(gè)數(shù)全部入棧了,輸出一組解(n最大為20,輸出棧可以使用遞歸), 9 第一個(gè)數(shù)始終是1,第二個(gè)數(shù)需要嘗試n+1的時(shí)候,就表示結(jié)束了(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 //函數(shù) 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)//本題數(shù)量不多,就直接這樣寫啦,如果數(shù)量多可以用【篩選法】或者【試除法】 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開始尋找匹配數(shù)字 72 while (flag) 73 { 74 b = s.top(); 75 next = GetNext(idx,n); 76 if (next == -1)//嘗試結(jié)束,回溯 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)//既要順時(shí)針為素?cái)?shù)環(huán)又要逆時(shí)針為素?cái)?shù)環(huán) 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 }

?

總結(jié)

以上是生活随笔為你收集整理的HDOJ1016 素数环(DFS)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。