八皇后問題 詳解 參考《紫書》

2022-06-26 17:03:08 字數 1503 閱讀 3462

在乙個8*8的棋盤上  放置八個皇后 , 使得他們互相不攻擊(皇后攻擊範圍為 同行同列同對角線) ,

從64個格仔中 選乙個子集 , 使得 " 子集 中恰好有八個元素 , 且任意選出的兩個格仔都不是同一行,同一列同,一對角線"  , 這是子集列舉問題 , 然而 , 64個格仔的自己有2^64個   ,   所需處理資料過大 !

從64個格仔中 選八個格仔 , 稱為組合生成問題 , 根據組合數學 有 4.426*10^9中方案 , 雖然比第一種好 , 但是然並卵 .

---------------------------我是分割線-------------------------------------- 

經過思考你會不難發現下面一種方法 , 每一行每一列恰好會放乙個皇后 , 所以可以從第一行開始放 , 然後考慮第二行 , 依次進行 下去 !

這樣就變成了全排列生成問題 , 這樣的排列有 8! = 40320個 , 列舉量不會超過該數字 

然而 如果每次都列舉這麼多次的話   也會超時的 , 所以我們可以採用回溯的方法   或者 用   上/下乙個排列 . 

1

//這是一種很常用的方法 ,平時的搜尋 都是這 一種形式

2 #include3 #include

4 #include5 #include6 #include7 #include8 #include9 #include10 #include

11 #include12

using

namespace

std;

13int tot,c[1000],vis[3][1000],n,a[11

];14

void search(int

cur)

1528}29

}30intmain()

3140

while(scanf("

%d",&n),n)

4144

return0;

45 }

下面附上另乙個用時最短0ms  並且 容易理解的   

1 #include2 #include

3 #include4 #include5 #include6 #include7 #include8 #include9 #include

10 #include11

using

namespace

std;

12int n,c[10],tot,a[11

];13

void search(int

cur)

1429}30

if(ok)

31 search(cur+1

);32}33

}34intmain()

3543

while(scanf("

%d",&n),n) //

幾皇后 ?

4447 }

八皇后問題 紫書(劉汝佳)

解題思路 任意兩個皇后不能出現在同行同列及同對角線,可以直接考慮每一行放乙個皇后,依次往下進行。11 第1行的皇后放在0,1列都會和第0行的皇后攻擊,所以直接到了第2列,當第0和1行這麼放置皇后時,我們發現下一行無論放在哪一列皇后都會相互攻擊,所以此路不通,第1行的i要移動到下乙個列。11 現在我們...

八皇后問題詳解

目錄 要在8 8的西洋棋棋盤中放8個皇后,使任意兩個皇后都不能互相吃掉。規則是皇后能吃掉同一行 同一列 同一對角線的棋子。如下圖即是兩種方案 問有多少種擺法。高斯認為有76種方案。1854年在柏林的象棋雜誌上不同的作者發表了40種不同的解,後來有人用圖論的方法解出92種結果。計算機發明後,有多種方法...

八皇后問題

八皇后問題 ackarlix 八皇后問題是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數學家高斯 1850 年提出 在 8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。高斯認為有 76種方案。1854 年在...