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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

素数环-dfs回溯+二维数组记录(c++实现)

發(fā)布時間:2024/2/28 c/c++ 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 素数环-dfs回溯+二维数组记录(c++实现) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

問題描述:

給你n(2<=n<=16)個正整數(shù)1,2,3…n,你的任務是把這n個正整數(shù)組成一個環(huán),使得任意相鄰的兩個整數(shù)之和為一個素數(shù),輸出有多少種合法方案。

輸入

多組輸入數(shù)據(jù),每組數(shù)據(jù)只有一個正整數(shù)n(2<=n<=16)代表有n個正整數(shù) 1,2,3…n

輸出

對每組數(shù)據(jù),輸出一個整數(shù),代表有多少種不同的可行方案數(shù)。

樣例輸入

6
8

樣例輸出

2
4
思路:
一.從輸入數(shù)據(jù)出發(fā):1,2,3,…N
因為素數(shù)都為奇數(shù),所以只能是偶+奇才能構(gòu)成素數(shù),通過簡單的畫圓環(huán)(如1 2 3當1-3連接時會出現(xiàn)偶數(shù),不成立)可以明顯發(fā)現(xiàn),只有當N為偶數(shù)時才可能構(gòu)成素數(shù)環(huán).當為奇數(shù)時直接為0.
二.從結(jié)果入手:因為我們要構(gòu)成奇數(shù)環(huán),N個數(shù)字實際構(gòu)成N個素數(shù)(可能重復),原數(shù)據(jù)的排列相當于這些素數(shù)的排列構(gòu)成了我們要的素數(shù)環(huán)
而要得到這些素數(shù)實際就是奇數(shù)和偶數(shù)的拼接.=>將每個可能使用到的素數(shù)進行拆分(拆分成奇數(shù)+偶數(shù) 對的形式,eg:5 =>(1,4),(2,3) )然后我們根據(jù)這些對找關(guān)聯(lián)即可(類似于數(shù)組鏈表格式(下標作為當前節(jié)點的位置值,值作為下一個節(jié)點的位置值)
eg:
a[1]=2 a[2]=3 a[3]=4 a[4]=1
1->2(a[1]=2)->3(a[2]=3)->4(a[3]=4)
三.關(guān)鍵條件:
1.首先在數(shù)據(jù)范圍內(nèi)包含的可能存在的素數(shù)的分解奇數(shù)+偶數(shù)對中存在上述的(1,2) (2,3),(3,4)。如果只有(1,2)(2,1)(3,4)就不行了,因為不能構(gòu)成一條相連的素數(shù)鏈也就不能構(gòu)成素數(shù)環(huán)。(素數(shù)環(huán)中存在的素數(shù)<=N2-1。因為可用的最大兩個元素是N-1和N,兩個元素之和最大為N2-1)
2.節(jié)點是否已訪問//可以維護一個長度N+1的節(jié)點數(shù)組用于存儲節(jié)點狀態(tài)
3.首尾應該能滿足相加為素數(shù)
四.如何去表示上述情況
使用一個二維數(shù)組T[N+1][N+1],eg:素數(shù)K可以分為1,K-1.則T[1][K-1]=T[K-1][1]=1(無向圖)
五.怎么判斷這是一種情況
因為是環(huán)狀結(jié)構(gòu)將其拆開成單條鏈判斷,一個環(huán)從任何位置切都只能算為一種情況,所以我們可以固定一個參考點,比如1或2的位置因為1,2是所有素數(shù)環(huán)(n>=2)都存在的元素.
eg:
1 2 3 4=>素數(shù)環(huán)
1 4 3 2=>素數(shù)環(huán)
2 3 4 1當然也是,但這種情況實際就是情況1只是這里我們選擇以2為參考

解題過程:(考慮N=6時,可以得到的最大奇數(shù)為11.括號中的是組成11及以下的素數(shù)(3,5,7,11)的奇偶數(shù)對。通過從1開始尋找能夠連接且不重復的數(shù)對(因為他們都是素數(shù)的數(shù)對所以之和也一定是素數(shù)),如 1-4,4-3, 3-2, 2-5, 5-6,他們構(gòu)成的鏈元素既不重復又將1-6使用完了。最后一步.檢查首尾。1-6 數(shù)對存在,所以這種情況成立即1-4-3-2-5-6-1)

補充:尾部應該判斷1-4和1-6是否可以構(gòu)成素數(shù).可從二維數(shù)組中的T[1][4]和T[1][6]是否為1判斷

//使用dfs遍歷所有情況 #include<iostream> #include<vector> using namespace std; int sum=0; void f(vector<vector<int> >&op,vector<int>check,int &a,int n,int start){if(n==a){sum++;return;}for(int i=2;i<=a;i++){if(op[start][i]&&check[i]==0){check[i]=1;if(n!=a-1||n==a-1&&op[1][i])f(op,check,a,n+1,i);check[i]=0;}} } int main() {int a;vector<int>res={3, 5, 7, 11, 13, 17, 19, 23, 29, 31};//最小1+2,所以不可能為2vector<int>check=vector<int>(17,0);check[1]=1;while(cin>>a){sum=0;if(a&1){cout<<0<<endl;continue;}vector<vector<int> > ans=vector<vector<int> >(a+1,vector<int>(a+1,0));for(int i:res){if(i>a*2)break;for(int j=1;j<=i/2;j++){if(i-j>a)continue;ans[j][i-j]=ans[i-j][j]=1;}}f(ans,check,a,1,1);cout<<sum<<endl;}return 0; }

總結(jié)

以上是生活随笔為你收集整理的素数环-dfs回溯+二维数组记录(c++实现)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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