n皇后 回溯和剪枝 HDU2553

2021-10-04 01:14:57 字數 1072 閱讀 5386

在棋盤上放置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 ...