八皇后問題
在乙個8×8的棋盤上放置8個皇后,使得他們不相互攻擊。每個皇后的攻擊範圍是同行同列和同對角線,求出所有解的個數
首先簡化問題,如果符合要求放滿8個皇后,那麼肯定保證每一行和每一列有且僅有乙個皇后。那麼顯然問題就變成了如何在一行或者一列放滿8皇后。接著就可以轉化為求符合要求的8的全排列,那麼求全排列我們顯然可以用dfs來解決
既然是逐行放置的,那麼皇后肯定不會橫向攻擊,因此只需要檢查是否縱向或者斜向攻擊即可。那麼怎麼判斷呢?我們可能會想到用乙個二維的vis陣列來把可攻擊的區域全部標記。這樣顯然時間複雜度有點大。通過紫書的學習,有乙個絕妙的利用棋盤座標性質的方法,我們設每行每列的座標值均為0-7:
求出每個格仔(x,y)的y-x差值,會發現同一主對角線的差值相同
求出每個格仔(x,y)的x+y的和,會發現同一副對角線的和相同
那麼我們由ans==ans[j]判斷是否同一列,cur-ans[cur]==j-ans[j]判斷是否同一主對角線,cur+ans[cur]==j+ans[j]判斷是否同一副對角線:
int ans[
1005];
int n,cnt;
void
solve
(int cur)
if(ok)
solve
(cur+1);}}
似乎節點數很難進一步減少了,但是程式效率可以繼續提高:引入乙個二維陣列vis[3][maxn],vis[0][i]標識第i列是否衝突,vis[1][cur+i]標識副對角線是否衝突,鑑於判斷y-x差值時可能為負數,那麼就再都加上n變成正數,即vis[2][cur-i+n]判斷主對角線是否衝突
bool vis[3]
[1005];
void
solve
(int cur)
}}
八皇后問題(回溯法)
問題描述 八皇后問題是十九世紀著名數學家高斯於1850年提出的。問題是 在8 8的棋盤上擺放8個皇后,使其不能互相攻擊,即任意的兩個皇后不能處在同意行,同一列,或同意斜線上。可以把八皇后問題拓展為n皇后問題,即在n n的棋盤上擺放n個皇后,使其任意兩個皇后都不能處於同一行 同一列或同一斜線上。問題分...
回溯法 八皇后問題
八皇后問題是高斯於1850年提出的,這是乙個典型的回溯演算法的問題。八皇后問題的大意如下 西洋棋的棋盤有8 行 8 列共64個單元格,在棋盤上擺放八個皇后,使其不能互相攻擊,也就 是說任意兩個皇后都不能處於同一行 同一列或同一斜線上。問總共有多少種擺放方法,每一種擺 放方式是怎樣的。首先來分析八皇后...
八皇后問題 回溯法
在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法 就拿四皇后來說吧 我們首先需要建立乙個一維陣列 這個陣列裡存放的就是皇后在該列合適的位置 這個陣列存放的是皇后放的行數,我們首先在第一列中找乙個可以放的地方,很明顯第乙個位置就可以...