八皇后問題是由國際西洋棋棋手馬克斯·貝瑟爾於2023年提出的問題,是回溯演算法的典型案例。
問題表述為:在8×8格的西洋棋上擺放8個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。
像這樣的棋盤:
對棋盤行和列標號,可以使用0~7
或1~8
,通過行數與列數進行加減計算,得到如下的內容:
行 - 列
和行 +列
,可以清晰的看到具有很明顯的規律
行 - 列
,紅線的方向,從左到右,從上到下的斜線,取值範圍[-7 , 7]
,,共15個元素
-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7
行 +列
,紅線的方向,從左到右,從下到上的斜線,取值範圍[2 , 16]
或[0 , 14]
,共15個元素
當列和行標號範圍 "1~8"
2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
當列和行標號範圍 "0~7"
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14
解題方法 :
注 :此處使用行列的標號範圍 "1~8"
設定陣列,判斷某位置是否處於乙個安全的位置
1. 建立陣列,並初始化
因為每種斜線最多有15種可能,行列最多只有8種可能
// 判斷左斜線
int r[16] = ;
// 判斷左斜線
int l[16] = ;
// 判斷列
int h[8] = ;
例如: 取 x = 4, y = 5 位置,其左斜線 -1 ,右斜線 9 ,列 4
由於陣列初始化為0,當填入一行皇后,需要進行佔位,利用行列號來修改陣列位置的值,修改為1
左斜線(x-y)取值範圍:[-7 , 7] ,因此在左斜線 x-y+8, 則對應陣列 l[1] 到 l[15]
右斜線(x+y)取值範圍:[2 , 16] ,因此在右斜線 x+y-1則對應陣列 r[1] 到 r[15]
例如:取 x = 4, y = 5 位置,4-5=-1
,4+5=9
,因此l[7]=1
、r[8]=1
2. 建立陣列儲存每種情況 , 並統計數量
// 符合條件的數量
int n = 0;
int que[8] = ;
建立一維陣列,來存放每行皇后的位置,每個皇后的取值都不同,也就是取值由0到7
3. 建立函式,輸出儲存陣列的情況
void print()
// 輸出
for (int i = 0; i < 8; ++i)
// 判斷是否符合條件
if( !l[row-i+8] && !r[row+i-1] && !h[i])}}
例子:
#include#include#includeusing namespace std;
// 符合條件的數量
int n = 0;
// 陣列存放每行皇后的位置
int que[8] = ;
// 判斷左斜線
int l[16] = ;
// 判斷左斜線
int r[16] = ;
// 判斷列
int h[8] = ;
void print()
// 輸出
for (int i = 0; i < 8; ++i)
// 判斷是否符合條件
if( !l[row-i+8] && !r[row+i-1] && !h[i])
}}int main(int ar**,char* argc)
; // 判斷左斜線
int r[size*2] = ;
// 判斷列
int h[size] = ;
// 陣列
int que[size] = ;
public:
queen(){};
~queen(){};
public:
void check(int row = 0)
for (int i = 0; i < size; ++i)
}} void prints()
// 輸出
八皇后問題 C
八皇后問題是乙個以西洋棋為背景的問題 如何能夠在 8 8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。八皇后問題可以推廣為更一般的n皇后擺放問題 這時棋盤的大小變為n1 n1,而皇后個數也變成n2。而且僅當 n2...
八皇后問題(C )
description 相信大家都聽過經典的 八皇后 問題吧?這個遊戲要求在乙個8 8的棋盤上放置8個皇后,使8個皇后互相不攻擊 攻擊的含義是有兩個皇后在同一行或同一列或同一對角線上 桐桐對這個遊戲很感興趣,現在他想知道每種合法 的擺放方案.input 無output 輸出若干行,每行乙個種方案,也...
八皇后問題 c
問題描述 八皇后問題是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數學家高斯1850年提出 在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。我的解法 public class queen private ...