輸入正整數n,把整數1,2,3,…,n組成乙個環,使得相鄰兩個整數之和均為素數。把全部的解按字典序排序後,從1開始編號,依次輸出指定編號的k組解。最後一行輸出總的方案數。同乙個素數環只算一次。
第1行:2個整數,n(n<=18)和k(1<=k<=10)
第2行:共有k個從小到大排列的整數,表示要輸出的解的編號。
前k行,每行一組解,對應於乙個輸入
第k+1行:乙個整數,表示總的方案數。
sample input
10 4sample output1 2 5 8
1 2 3 4 7 6 5 8 9 101 2 3 4 7 10 9 8 5 6
1 2 3 8 5 6 7 10 9 4
1 2 3 10 9 8 5 6 7 4
96
分析:
演算法思維與(一)一樣,但需要注意這樣兩點(坑點):
1.「把全部的解按字典序排序後,從1開始編號,依次輸出指定編號的k組解。最後一行輸出總的方案數。同乙個素數環只算一次。」實現這句話其實就是要固定環的第乙個數為1,這樣就可以保證不重複,且按字典序排序。
2.要求輸出指定的k組解,我是在輸出的時候處理的,要統計總數就在那裡自增,再判斷當前解是否是指定的k組解中的,是才輸出
程式實現如下:
#include#includeint a[19],k,sum,n[11],num=1,q;
bool b[19]=;
bool p(int s)//判斷是否為素數
void print()
{ sum++;//此時的sum也是此素數環的順序,產生完所有的素數環之後,sum即為所有的組數
if(sum==n[num])//如果此時是k組資料,才輸出
{for(int i=1;i
c 演算法之回溯 素數環(一)
題目描述 從1到20這20個數擺成乙個環,要求相鄰的兩個數的和是乙個素數。請輸出所有方案 一本通例5.3 題目分析 將題目想象成一張二維表,要往裡面填1 20這20個數,可以利用框架構造 需判斷數是否合法且相鄰兩個數之和為素數 函式判定 以及最後乙個數和第乙個數是否為素數 這裡可以在輸出時判定,節約...
素數環 回溯演算法
設計 這個素數環有20個位置,每個位置可以填寫1 20的整數,可以對每個位置從1搜尋 約束條件 1 與前面已經填寫的數不重複 2 與前乙個數的和為素數 3 最後乙個數與第乙個數的和為素數 在填寫第k個位置時,如果滿足約束條件,則繼續填寫k 1個位置 如果1 20都不滿足,就回溯到k 1個位置,從原來...
回溯演算法求素數環
把從1到n n 2 這n個數擺成乙個環,要求相鄰的兩個數的和是乙個素數,找出所有滿足條件的環。1 解向量 2 解空間樹 排列樹,n 1 個葉子結點 3 剪枝函式 isprime x t 1 x t t 2,3,n 約束函式 三.演算法實現 1 include2 include3 using name...