八皇后問題

2021-06-15 02:08:24 字數 2208 閱讀 4693

為求簡單起見,先看四皇后問題。

所謂皇后問題,即任意兩個皇后不能處於同一列,也不能同時處於同一行,而且還不能處於同一對角線上。

我們以列為單位進行放置,即同一列僅放置乙個皇后,

1. 假設將皇后放於第一行第一列,則同一行,同一列,對角線上,均不能放置皇后

首先檢測對角線,將汙染位置用紅x表示。

接下來將同一行的汙染位置標記為紅x

2.  放置第二個皇后

先檢測主對角線,將汙染位置做標記。

接下來檢測輔對角線,標記汙染位置。

3. 第三個皇后無法放置,所以必須回溯,重新放置第二個皇后,但同樣無法的解。

所以回退到第一步,重新放置第乙個皇后的位置。

先檢測主對角線

然後是輔對角線

然後是同一行,並放置第二個皇后

主,輔對角線

同一行,並放置皇后

主,輔對角線,同一行,並放皇后

上圖即得到乙個解。

用乙個四原陣列記錄所得解,陣列中每個元素對應棋盤的一列。

例如,上述解可以表示為[2, 4, 1, 3],即第乙個皇后放在

第1列第2行,第二個皇后放在第2列第4行,第三個皇后放在

第3列第1行,第四個皇后放在第4列第3行。

我們用result來命名這個陣列,

首先有乙個檢測函式,檢測是否可以放置。原理:檢測同一行是否有皇后,並檢測主輔對角線上是否有皇后,

主輔對角線可根據斜率正負1來判斷。 

bool place(int *result, int row)

return true;

}

引數row為正在處理的列,而result[row]為該皇后放置的行。檢測該皇后是否與已放置的皇后處於同一行,同時通過斜率檢測對角線是否有皇后。

int queen(int n)

//放置下一皇后

else if(result[row] <= n && row < n)

//放置失敗,回退到上一皇后,重新放置

else

}return total;

}

main函式及結果。

同樣,皇后問題也可以通過遞迴來解決。

bool place(int *result, int row)

return true;

}void recursion(int *result, int row, int n, int &total) }}

int queen(int n)

八皇后問題

八皇后問題 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...