問題描述:
有乙個n*n的棋盤,在這個棋盤中放n個皇后,使得這n個皇后,任意兩個皇后不在同一行,同一列,同一條對角線。例如,當n等於4時,有兩種擺法。
輸入只有乙個整數n。
思路如果我們是從這個n*n的棋盤中選取n個方格放皇后,再去判斷是否滿足條件的話,則效率會非常低,這是乙個組合數∁
\complement∁nn
∗nn \atop n*n
n∗nn
,當n等於8時,就要列舉54502232次
方法一:遞迴暴力法
做這個題之前,我們回想一下字串全排列,這個和它相似,可以列舉每一行的列數,列舉完乙個棋盤後,判斷任意兩個皇后是否在同一條線上,例如上面的擺法1(2413).這個方法的複雜度為n!
**
#include
#include
int rank[15]
;//pos列i行
bool vis[15]
;//標記第i行是否走過
int n,cnt=0;
void
dfs(
int pos)}if
(flag2==false)
break
;//如果乙個填滿情況對角線有兩個或以上,則直接跳出迴圈 }if
(flag) cnt++
;return;}
for(
int i=
1;i<=n;i++)}
}int
main()
方法二:遞迴回溯法
上面的方法一是當形成乙個n*n的棋盤時,才去判斷是否滿足條件。
而我們在遞迴時,可以提前判斷是否滿足條件,如果不滿足,則不用遞迴下去,返回上一層進行處理,這種方法稱為回溯法。這個題是當我們遞迴的時候就去判斷當前的皇后是否和前面的皇后在一條對角線上,如果在一條直線上,就不需要遞迴下去了,返回上一層;如果不在,就繼續遞迴,下乙個繼續進行判斷,直到滿足條件為止。
**
#include
#include
int rank[20]
;bool vis[20]
;int n,cnt=0;
void
dfs(
int pos)
for(
int i=
1;i<=n;i++)}
if(flag)}}
}int
main()
基於C語言實現的N皇后問題
1 專案簡介 八皇后問題是乙個古老而著名的問題,是回溯演算法的經典問題。該問題是十九世紀著名的數學家高斯在1850年提出的 在8 8的西洋棋棋盤上,安放8個皇后,要求沒有乙個皇后能夠 吃掉 任何其它乙個皇后,即任意兩個皇后不能處於同一行,同一列或者同一條對角線上,求解有多少種擺法。高斯認為有76種方...
基於C語言實現的N皇后問題
1 專案簡介 八皇后問題是乙個古老而著名的問題,是回溯演算法的經典問題。該問題是十九世紀著名的數學家高斯在1850年提出的 在8 8的西洋棋棋盤上,安放8個皇后,要求沒有乙個皇后能夠 吃掉 任何其它乙個皇后,即任意兩個皇后不能處於同一行,同一列或者同一條對角線上,求解有多少種擺法。高斯認為有76種方...
基於C語言實現的N皇后問題
1 專案簡介 八皇后問題是乙個古老而著名的問題,是回溯演算法的經典問題。該問題是十九世紀著名的數學家高斯在1850年提出的 在8 8的西洋棋棋盤上,安放8個皇后,要求沒有乙個皇后能夠 吃掉 任何其它乙個皇后,即任意兩個皇后不能處於同一行,同一列或者同一條對角線上,求解有多少種擺法。高斯認為有76種方...