八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。
該問題是國際西洋棋棋手馬克斯·貝瑟爾於2023年提出:在8×8格的西洋棋上擺放八個皇后,使其不能互相攻擊,
即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。
高斯認為有76種方案。2023年在柏林的象棋雜誌上不同的作者發表了40種不同的解,後來有人用圖論的方法解出92種結果。
計算機發明後,有多種計算機語言可以解決此問題。
如下用c++**實現:
演算法說明:
結構:用乙個一維陣列表示8皇后排放的位置。(如下圖)
演算法說明:
現嘗試再第一列的任意位數放皇后,然後在嘗試在第二列的任意位置放皇后,依次迭代。
迭代到第8行,如果有成功的就將擺法數加1。
一維陣列的複製組合全部實驗過後,程式結束。
回溯點:
1.gcount++, print();
geightqueen[index] = 0;
2.eight_queen(index + 1);
geightqueen[index] = 0;
上面的說明希望有利於您的理解,哦,在加一句總結。
回溯法的關鍵就是設計乙個可回溯的資料結構,這是關鍵,就像該問題的一維陣列(geightqueen[8] )一樣。
#include
using
namespace std;
static
int geightqueen[8]
=, gcount =0;
void
print()
//輸出每一種情況下棋盤中皇后的擺放情況
cout <<
"*************************=\n";}
intcheck_pos_valid
(int loop,
int value)
//檢查是否存在有多個皇后在同一行/列/對角線的情況
return1;
}void
eight_queen
(int index)
eight_queen
(index +1)
; geightqueen[index]=0
;}}}
intmain
(int argc,
char
*ar**)
演算法 八皇后問題
問題簡述 八皇后問題是乙個以西洋棋為背景的問題 如何能夠在8 8的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。八皇后問題可以推廣為更一般的n皇后擺放問題 這時棋盤的大小變為n1 n1,而皇后個數也變成n2。而且僅當...
演算法 八皇后問題
問題描述 八皇后問題是乙個以西洋棋為背景的問題 如何能夠在8 8的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。八皇后問題可以推廣為更一般的n皇后擺放問題 這時棋盤的大小變為n n,而皇后個數也變成n。當且僅當n 1...
演算法 八皇后問題
created by xiaoyu on 2019 10 6.include include using namespace std const int n 8 int board n n int tot 0 int valid int x,int y for int i 0 i x i retur...