8皇后問題是一道非常經典的題目。題目是說,乙個n*n的西洋棋棋盤上主放置n個皇后,使其不能相互攻擊,即任何兩個皇后都不能處在棋盤的同一行,同一列,同一條斜線上,試問共有多少種擺法?
其實,題目就是要找出所有的可能情況,然後排除其中不符合條件的情況,剩下的情況即為所要求的。怎麼找出所有的情況呢?對於8皇后,我們可以使用窮舉法,窮舉出每一種放置方法,然後判斷是否符合題意。如果每次放一行,那就需要8重迴圈才可以解出來。雖然空間複雜度可以小到為0,但是時間複雜度太高。
書中一般使用回溯法來解此題。仔細分析此題,可以發現:每一行上只能放置乙個皇后,然後後面每行放置的皇后,不能與前面的行上放置的皇后在同一列上或者同一對角線上。所以用乙個一維陣列就可以存放在棋盤上放置的皇后的行列資訊:一維陣列的第i個位置存放的數值j就表示,在棋盤的第i行、第j列上放著乙個皇后。棋盤的一行就用乙個元素來表示,所以不能在同一行就不用判斷了。知道了皇后在棋盤的行列位置後,判斷是否符合後面的兩個條件也比較容易了(對角線只要仔細分析下,兩個二維座標點如果在對角線上,他們的行列座標將會滿足何種情況即可)。
下面貼出8皇后問題的**:
#include
<
iostream
>
#include
<
cmath
>
using
namespace
std;
void
printresult(
int*
arr,
intn)
bool
verify(
int*
arr,
inti)
/*雖然只用了乙個一維陣列,但是其中已經儲存了足夠的資訊。
因為每一行只能放乙個皇后,所以一維陣列的第i個位置存放的
是在第i行的哪一列(第j列)上放置了皇后。這個遞迴函式
每次處理一行,直到第n行(下標從1開始)。
*/void
nqueens(
int*
arr,
inti,
intn)}}
intmain()
最後還有乙個回溯的模般
回溯法對解空間作深度優先搜尋,因此,在一般情況下用遞迴方法實現回溯法。
:
void backtrack (int t)}供大家學習!
遞迴回溯總結
遞迴回溯法對解空間樹作深度優先搜尋,一般情況可表示為 void backtrack int n else 引數n表示遞迴的深度 is ok 表示已經求得問題解 print reult 表示列印結果 如果只求出乙個可行解,那麼求得第乙個問題解後便可exit 如果要求出所有可行解則不需exit base...
leetcode 遞迴 回溯問題 總結
注意 整體思路清晰,回溯的過程大概是怎樣的 每層遞迴實際上要解決的問題是什麼 一定記住,該重置的狀態要重置,因為回溯就是相當於在每一層的遞迴中做選擇,選擇了不同的選項,在遇到阻礙或者達到條件結束遞迴之後,再想嘗試其他的選擇路徑,應當記住回退到之前的狀態。縱向 遞迴的深度,完整地解決問題 搜尋完所有的...
使用with遞迴回溯
向上回溯,查詢頂級部門 declare pdeptid uniqueidentifier with dept deptid,pdeptid as select udepid,uparentid from oa.dbo.depinfo where udepid in select p.udepid f...