C 八皇后問題

2021-10-12 05:50:12 字數 2657 閱讀 7981

八皇后問題是由國際西洋棋棋手馬克斯·貝瑟爾於2023年提出的問題,是回溯演算法的典型案例。

問題表述為:在8×8格的西洋棋上擺放8個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。

像這樣的棋盤:

對棋盤行和列標號,可以使用0~71~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]=1r[8]=12. 建立陣列儲存每種情況 , 並統計數量

// 符合條件的數量

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 ...