設計
這個素數環有20個位置,每個位置可以填寫1~20的整數,可以對每個位置從1搜尋
約束條件:(1)與前面已經填寫的數不重複
(2)與前乙個數的和為素數
(3)最後乙個數與第乙個數的和為素數
在填寫第k個位置時,如果滿足約束條件,則繼續填寫k+1個位置;如果1~20都不滿足,就回溯到k+1個位置,從原來填寫的數+1開始檢查
**:
#include
#include
using
namespace std;
/*約束條件:(1)與已經填寫的數不重複
(2)與前乙個數的和是素數
(3)最後乙個數與第乙個數的和是素數
*/bool
isprime
(int x)
;void
backtracking
(int n)
;bool
check
(int t)
;static
int n=20;
int arr[20]
;int
main()
void
backtracking
(int n)
int k=1;
arr[0]
=1;//將第乙個位置置為1,素數環從1開始
while
(k>=1)
else}if
(arr[k]
<=n&&k==n-1)
//求解完,輸出
return;}
if(arr[k]
<=n&&k
//第k個位置填寫完,繼續填寫第k+1個位置
else}}
//檢查當前選擇的數與前面選的數是否重複,並且判斷是否與前乙個數的和為素數
bool
check
(int t)}
flag=
isprime
((arr[t]
+arr[t-1]
));if
(flag&&t==n-1)
//最後乙個數與第乙個數的和為素數
return flag;
}bool
isprime
(int x)
//判斷乙個數是否是素數
}return
true
;}
結果
分析
n個位置,每個位置可以填寫的情況有n種,因此素數環問題的解空間是一顆完全n叉樹,樹的深度2為n,
最壞情況下的時間複雜度為o(n^n)
總結:
通過本次實驗加深了我對回溯演算法所給的模式的理解,同時對用回溯演算法解決乙個實際問題有了乙個更深層次的認識。回溯演算法非遞迴的模式通用,用它解決乙個問題的關鍵是找出合法解與部分解.的判斷條件,在合法解時書寫相應程式段,在部分解時書寫相應程式段。另外注意有些條件部分解和合法解都要滿足,此時要排除掉非法解,即要給它剪去。另外需要注意的是回溯的過程。總之,通過本次實驗使我掌握了回溯演算法非遞迴的一般模式,以後在解決一類問題時可以照著這個模式編寫程式。
回溯演算法求素數環
把從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...
素數環 回溯
include stdafx.h include includebool isprime int ijudgednum return false void swap int itemp1,int itemp2 void generateperm int piscr,int isize,int icu...
素數環 回溯
1 2 created by arc on 2020 5 1.3 勞動節快樂!45 6 從一到二十個數擺成乙個環,要求相鄰兩個數的和是素數 包括 和 保證第乙個數為一 要不每個還都要輸出num遍 7 輸出所有環8 9 多工,挨個試,用回溯 回溯也是某種意義上的dfs吧 1011 include 12...