經典問題之八皇后問題

2021-08-21 14:37:10 字數 862 閱讀 3504

八皇后問題是乙個以西洋棋為背景的問題:如何能夠在 8×8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后,為了達到此目的,任兩個皇后都不能處於同一條橫行、縱行或斜線上。

我們先來考慮,某個位置是否能夠放皇后,如下圖

兩個皇后的位置是<1,1>,<2,3>,那麼接下來的第三個皇后該怎麼放呢?

1、設row為行,col為列,我們可以從第3行第0列開始迴圈。

2、當col與前面已放置皇后的列相等時,我們不放。

3、當abs(row - i) = abs(col - j),表示右上斜線與左上斜線已有皇后,我們不放,i,j表示已放置皇后的行值和列值。

然後採用遞迴方式,遞迴第row+1行,擺放下乙個皇后,當row = 8時,表示8個皇后全部放置完成,即為一種可行的8皇后擺放方法。

#include #include using namespace std;

int count = 0; //統計擺放方法數

void queen(int row,int a)

else

}if(flag)

queen(row+1,a);//符合則遞迴下一行}}

}int main()

{ int a[8]; //存放皇后的位置,以陣列下標為行,值為列

queen(0,a); //從第0行開始遞迴

cout << "總共有 " <

經典演算法之八皇后問題

問題描述 八皇后問題是乙個以西洋棋為背景的問題 如何能夠在 8 8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。下面利用回溯法 遞迴寫法 來求出所有可能的結果 include include include in...

經典遞迴問題 八皇后

八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。解題思路 在這之前我們要明確遞迴求解其實是分成兩個部分的 遞迴回朔...

DFS經典 八皇后問題

題目 題解 check 0 i 標記列 check 1 line i 標記斜向上的對角線,對於同一條這個方向得對角線行列和相同 check 2 line i n 標記斜向下的對角線,對於同一條這個方向得對角線行列差相同但是可能是負數,所以加上n使其恒為正數 解法一 遞迴解法 includeusing...