/*
* 素數環,相鄰兩個相加是否為素數,數字範圍(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 ...