在棋盤上放置8個皇后,使它們不同行,不同列,不同對角線。問有多少種合法的情況?
n皇后問題是8皇后問題的擴充套件。
key2
如何遞迴?
每一行放置乙個皇后
void
dfs(
int r)
// 一行一行的放置皇后,本次在第r行開始
// r是從0開始計數的
for(
int i =
0; i < n; i++)}
}
如何剪枝?
原皇后(i, j), 新皇后(r, c)
(1) 橫向,不同行: i != r
(2) 縱向,不同列: j != c
(3)斜對角,從(i, j)向斜對角走a步,走到新座標(r, c)有以下四種情況。
bool
check
(int r,
int c)
return
true
;}
複雜度分析dfs()一行行的放置皇后,複雜度o(n!)
check()衝突檢查o(n)
總的複雜度o(n x n!)
hdu–2553**如下:
#include
using
namespace std;
const
int maxr =10;
int n, ans;
int queen[maxr]
;bool
check
(int r,
int c)
return
true;}
void
dfs(
int r)
for(
int i =
0; i < n; i++)}
}int
main()
while
(cin >> n)
return0;
}
採用另一種資料結構dancing links可以解決15皇后的規模,詳細介紹見以下部落格: N皇后問題 HDU 2553
在n n的方格棋盤放置了n個皇后,使得它們不相互攻擊 即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。你的任務是,對於給定的n,求出有多少種合法的放置方法。input共有若干行,每行乙個正整數n 10,表示棋盤和皇后的數量 如果n 0,表示結束。output共有若干行...
N皇后問題 HDU 2553
在n n的方格棋盤放置了n個皇后,使得它們不相互攻擊 即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。你的任務是,對於給定的n,求出有多少種合法的放置方法。input 共有若干行,每行乙個正整數n 10,表示棋盤和皇后的數量 如果n 0,表示結束。output 共有若...
N皇后問題 HDU 2553
問題 在n n的方格棋盤放置了n個皇后,使得它們不相互攻擊 即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。你的任務是,對於給定的n,求出有多少種合法的放置方法。input 共有若干行,每行乙個正整數n 10,表示棋盤和皇后的數量 如果n 0,表示結束。output ...