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...