八皇后問題

2021-08-05 20:48:13 字數 960 閱讀 5076

八皇后問題就是八個皇后問題嘛,啊?你還想知道別的資訊?沒了,真的沒了。騙你的,其實還有,哈哈哈。八皇后問題的問題描述就是:在棋盤上放置8個皇后,使得它們互相不攻擊,此時每個皇后的攻擊範圍為同行同列和同(主,副)對角線,要求找出所有的解。

最近正在補權遊(我不是那種追劇的人,一般喜歡養肥了再看),看到這道題就想到了瑟曦和瑪格麗兩個皇后撕逼,皇后何必為難皇后呢,扯遠了,回到正題。這道題之前演算法課上也見過,不過沒有自己動手寫。今天又在紫書上(p191)看到了,劉汝佳給的回溯法的乙個引例。

整體思路就是:由於各行各列上正好只能有乙個皇后,用c[x]來表示x行皇后所在的位置,則這個問題就變成乙個全排列問題。根據回溯法遞迴的求解出每一種情況。

在求解過程中尋找第x行皇后可以存在的位置時,通過乙個vis[3]來判斷,用vis[0][i]來判斷第i列當前是不是已存在的皇后的攻擊範圍,vis[1][cur+i],和vis[2][cur-i+n]來分別判斷(cur,i)這個位置在不在已存在的皇后的(副,主)對角線攻擊的範圍內。(關於主副對角線的攻擊判定,可以參考紫書上p193的兩個圖,博主沒有找到那兩個圖,也不想畫,懶。。。)同一條主對角線上的cur-i相同,同一條主對角線上的cur+i相同。這是乙個很重要的原理。

還有乙個重點就是,如果在回溯法中使用了輔助的全域性變數,則一定要及時把他們恢復原狀。特別地,若函式有多個出口,則需要在每個出口都要恢復被改變的值。

#include#includeusing namespace std;

void search(int cur);

const int maxn = 100;

int vis[3][maxn];

int board[maxn];

int n = 8,kase=0;

int main()

void search(int cur)

cout << endl;

} }else

} }}

八皇后問題

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

八皇后問題

include iostream.h int a 8 8 棋盤 int r 8 結果 int i,j int count 0 void init i j 0 int judge int x,int y for int mi x 1,mj y mi 1 mi for int ri x 1,rj y 1...

八皇后問題

package quess 由於八個皇后的任意兩個不能處在同一行,那麼這肯定是每乙個皇后佔據一行。於是我們可以定義乙個陣列columnindex 8 陣列中第i個數字表示位於第i行的皇后的列號。先把columnindex的八個數字分別用0 7初始化,接下來我們要做的事情就是對陣列columninde...