由素數環思考回溯演算法的實現步驟

2021-06-28 23:09:03 字數 1976 閱讀 4318

/*

* 素數環,相鄰兩個相加是否為素數,數字範圍(1~20)

* 陣列+和是否素數

* 回溯,返回到上乙個

*/public

class

primering

if(arr[k]<=numlength&&k==numlength-1)

if(arr[k]1)

else}}

/*** 判斷當前放進的數字是否符合條件

* 1.是否與之前重複

* 2.相鄰之和是否素數

* 3.第乙個和最後乙個相加是否為素數

*/public

static

intcheck

(int arr,int k)

flag=prime(arr[k-1]+arr[k]);//相鄰之和是否素數

if(flag==1&&k==numlength-1)

return flag;}/*

* 判斷之和是否為素數

*/public

static

intprime

(int sum)

return

1; }

}

這道是典型的回溯問題,對於此問題,相應的演算法是有規律可行的。在此我自己總結成偽**,以後方可往裡面套就可以解除問題的解了。

步驟如下:

void way 

關鍵就是判斷是否符合條件的函式

2-3. 得到解的其中乙個條件可以為k==右邊界-1,具體問題具體分析,要return; 

2-4. if(arr[k]<=n&&k《右邊界-1) 

移動到下一位 k++; 

else 

回溯; 將這個將要填寫的值賦值為0,移到上一位。a[k–]=0; 

}

大題就是這個框架,而關鍵在於:

判斷是否符合條件,因題目的變化而變化,典型是要判斷重複;

找到正解時,進行跳出

回溯;移動到上一位,難點在這裡,很多題目並不是k–;就移動到上一步的步驟的,而更多的是用path陣列來記錄路徑,通過path來回到上一步。

注意:每次使用while()迴圈,必須關注邊界的處理跳出。

下面看一道,要使用路徑的回溯問題 

題目:今有7對數字:兩個1,兩個2,兩個3,…兩個7,把它們排成一行。 

要求,兩個1間有1個其它數字,兩個2間有2個其它數字,以此類推,兩個7之間有7個其它數字。如下就是乙個符合要求的排列: 

17126425374635 

當然,如果把它倒過來,也是符合要求的。 

請你找出另一種符合要求的排列法,並且這個排列法是以74開頭的。 

注意:只填寫這個14位的整數,不能填寫任何多餘的內容,比如說明注釋等。 

74*4*7****

**參考:

package backalg;

/* * 今有7對數字:兩個1,兩個2,兩個3,...兩個7,把它們排成一行

* 74****4*7*******

* 0123456789

* 1011121314

*/public

class

numsort

else

arr[k]=arr[k]+1;

}if(arr[k]<=6&&k1)

if(k==arr.length)

}else

path[k]=0;//重置

if((arr[k]+k+1)//重新對上一次的進行判斷,所以對應的要變為0

arr[arr[k]+k+1]=0;}}

}/*

* 判斷是否重複

* 對應賦值判斷,是否符合條件

*/public

static

intcheck

(int k,int

value)

}

素數環 回溯演算法

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

回溯演算法解決素數環問題

素數環 從1到20這20個數擺成乙個環,要求相鄰的兩個數的和是乙個素數 演算法流程 1 資料初始化 2 遞迴填數 判斷第i個數填入是否合法 a 如果合法 填數 判斷是否到達目標 20個已填完 是,列印結果 不是,遞迴填下乙個 剪枝條件 b 如果不合法 選擇下一種可能 include include ...