素數環 回溯演算法

2021-10-25 12:07:31 字數 1697 閱讀 2785

設計

這個素數環有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...