N皇后問題(搜尋)

2021-08-28 09:43:36 字數 1999 閱讀 1956

problem description

在n*n的方格棋盤放置了n個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。

你的任務是,對於給定的n,求出有多少種合法的放置方法。

input

共有若干行,每行乙個正整數n≤10,表示棋盤和皇后的數量;如果n=0,表示結束。

output

共有若干行,每行乙個正整數,表示對應輸入行的皇后的不同放置數量。

sample input18

50sample output192

10解題思路

這道題主要考察的是回溯的思想。

我們以5個皇后為例講這道題

首先我們把第乙個皇后放在(1,1)處。那麼很顯然,第一行第一列以及(i,i)點所處位置即45度斜線方向都不可以放皇后了

我們看下乙個皇后應該放在那裡。(先看列再看行),很顯然第一列不可以放了,第二列第一行即(1,2)不可以。第二列第二行(2,2)可以。那麼我們放第二個皇后,同時按要求把他鎖在的行列和45度角方向畫上斜線

同上面的步驟一樣,我們再找下乙個皇后位置(2,3)。

我們可以看出來,這樣放過(2,3)之後就在也放不下下乙個皇后了。所以這種方法一共只能放三個皇后。是不合法的。

此時我們就用到了回溯。就是恢復到上乙個放的皇后(2,2)**。重新找下乙個皇后,而且我們知道在找到(2,3)皇后之前我們已經判斷過哪些點了,所以我們緊接著判斷(2,3)後面的點(2,4)就可以了,並且我們一定要把(2,3)位置恢復成沒有標記過的點。

找到下乙個皇后(第三個皇后)位置為(5,3).

找第四個皇后位置(2,4)

找到第五個皇后位置

我們可以看出5個皇后已經都安排好位置了。我們再重新從空表開始,確定第乙個皇后的位置就是(2,1)。按以上步驟找就可以了

int erwei[12][12]; //標記是否可以放皇后

int hang[12]; //標記行是否可以放皇后

int lie[12]; //標記列是否可以放皇后

int sum; //一共有幾種方法

int table[12]; //幾個皇后對應的有幾種方法

bool check(int i, int j)

for(s=i+1,t=j+1;s=0&&t=0;s++,t--) //判斷左下角有沒有皇后。

return true;

}void dfs(int j)

for(int i=0;i

}}int main()

while(scanf("%d",&n))

return 0;

}

DFS搜尋 N皇后問題

八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在88格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。高斯認為有76種方案。1854年在柏林的象棋雜誌上不同的作者發表了4...

簡單搜尋01 N皇后問題

題目大意 在n n的方格棋盤放置了n個皇后,使得它們不相互攻擊 即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。你的任務是,對於給定的n,求出有多少種合法的放置方法。解題思路 回溯法。要先打表,不然tle。自覺已經精簡到最簡了結果還是tle的痛苦人民得到大佬的提示要先...

搜尋與回溯演算法 N皇后問題

在乙個n n n nn n的西洋棋棋盤上放置n n 12 n n 12 n n 1 2 個皇后,使它們不能互相攻擊 即任意兩個皇后不能在同一行 同一列或同一對角線上 試求出第一種 皇后在第i ii行最靠前的情況下,以後各行也盡量靠前 排列方案,和所有方法。輸入乙個數n n 12 n n 12 n n...