經典遞迴問題 八皇后

2021-06-21 11:02:49 字數 1305 閱讀 2570

八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟爾於2023年提出:在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。

解題思路:在這之前我們要明確遞迴求解其實是分成兩個部分的:遞迴回朔 遞迴部分就是整個問題的核心求解步驟,也是乙個問題重複執行的部分而回朔則發生在問題分解到了盡頭,或者問題求解不能再繼續下去的時候,程式開始回朔。回朔要確保恢復現場,什麼意思呢,就是遞迴函式在返回後,程式裡面的變數要和之前呼叫遞迴函式之前一致!這一點在很多時候會被忽略,比如一些全域性的變數。

現在我們來看具體問題:第一步肯定是在棋盤的第一行選乙個位置,之後我們要幹兩件事:

更新棋盤的資訊,標記哪些位置已經不能放棋子了。

選擇下一行要放置棋子的位置 。  

之後的核心操作就是重複上面兩步,所以上面就是整個問題的遞迴部分。之後我們要考慮程式的盡頭,也就是回朔的條件。

假如我們一直選擇棋子的位置直到最後一行,那麼我們完成了一次布局,把他記錄下來然後回朔到上一層。

假如我們還沒到最後一行,但是我們已經不能在這一行放置棋子了,也就說我們的求解遇到了死胡同。這時候我們也要回朔,回到上一行選擇別的位置,假如上一行也沒位置了,那麼就再返回,直到可以繼續向下走。

這裡我們要注意了,因為棋盤的資訊是乙個8*8的全域性陣列,所以當我們返回上一層並且選擇其他位置的時候,要把之前選擇位置造成的棋盤資訊的改動還原回去!

#includeusing namespace std;

int board[8][8]=;

int temp_pos[8]=;

int chessplace[92][8]=;

int cnt_ways=0;

void copy(int a,int b)

//傳入棋子所在的層數和位置

void calplace(int level,int pos)

}//對下一顆棋子所有可能的位置進行試探遍歷

for(j=0;j<8;j++)

calplace(level+1,j);//遞迴

//回朔

for(q=0;q<8;q++)

for(w=0;w<8;w++)

if(board[q][w]==level+2)

}} }

int main()

for(j=0;j<92;j++)

while(cin>>n)

{ while(n--)

{

cin>>temp;

temp--;

for(i=0;i<8;i++)

cout<

遞迴解決經典八皇后問題

public class recursiontest 列印問題 public static void test int n else 階乘問題 public static intfactorial int n else 迷宮問題 迷宮問題,求初始點到終點的一條通路 不一定是最小通路!牆體設為1,路徑...

經典 八皇后 遞迴

八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法.由於使用迴圈會存在多層,比較繁雜,這裡使用遞迴dfs 深度優先搜尋...

皇后問題 經典遞迴

八皇后問題是乙個以西洋棋為背景的問題 如何能夠在 8 8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。上圖是乙個合格的皇后棋盤。如果要計算可以擺放的種數和求出擺放的情況,解決方案就是,每次按行搜尋,然後搜尋中確保...