time limit: 1 sec
memory limit: 64 mb
special judge
submit: 12
solved: 3 [
submit][
status][
web board]
在n×n 格的棋盤上放置彼此不受攻擊的n 個皇后。按照西洋棋的規則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。n後問題等價於在n×n格的棋盤上放置n個皇后,任何2 個皇后不放在同一行或同一列或同一斜線上。 設計乙個解n 後問題的佇列式分支限界法,計算在n× n個方格上放置彼此不受攻擊的n個皇后的乙個放置方案。
輸入資料只佔一行,有1 個正整數n,4≤n≤20。
將計算出的彼此不受攻擊的n個皇后的乙個放置方案輸出。第1行是n個皇后的放置方案。
5 1 3 5 2 4
n皇后問題
解決這道問題有兩種不同形式的做法:遞迴和迭代。
遞迴和迭代有什麼區別呢?
簡單來說,遞迴就是自己呼叫自己,如:intabc(...)
return0;
}而迭代是重複一組指令,不斷地根據變數的舊值推出新值,如:
for(; ; ;) //
迭代終止條件
我想有一部分人也是分不清的吧,包括我自己也是,現在重溫一下這兩者的區別。
***********************************
好了,剛才只是題外話,現在我們回歸正題。
不管是遞迴還是迭代,實際上思路都是一樣的。
解題思路:
題目要求任意一橫排、一豎列、一斜線上不能有兩個皇后,那麼我們以行i做乙個迴圈
,每迴圈一次就確定第i個皇后在第幾列。很顯然第i個皇后的位置不能和之前(i-1)個皇后的位置重複
,也就是a[i]!=a[1]/a[2]/.../a[i-1],那麼寫乙個遞迴函式f(i),確定第i個皇后的位置。
下面是我用遞迴做的**:
1#include 2
3using
namespace
std;
4intn;5
int a[100];6
bool f(inth)7
16}17else
30if(j31continue
;32 a[h]=i;
33if(f(h+1
)) //判斷下乙個皇后的位置。
34return
true;35
}36}37
return
false
; //條件都不符合,則說明這種擺法不合適,回溯,換一種擺法。38}
領扣刷題 N皇后問題
題目描述如下 n 皇后問題研究的是如何將 n 個皇后放置在 n n 的棋盤上,並且使皇后彼此之間不能相互攻擊。上圖為 8 皇后問題的一種解法。給定乙個整數 n,返回所有不同的 n 皇后問題的解決方案。每一種解法包含乙個明確的 n 皇后問題的棋子放置方案,該方案中 q 和 分別代表了皇后和空位。示例 ...
深度搜尋入門題n皇后問題
深度搜尋入門題n皇后問題 問題描述 要在n n的西洋棋棋盤中放n個皇后,使任意兩個皇后都不能互相吃掉。規則是皇后能吃掉同一行 同一列 同一對角線的棋子。即不能放置在有被吃危險的位置 input 乙個整數n ouput q種放置方法下每種方法所對應n個皇后的具體座標和q的值 sample input ...
回溯入門題 N皇后問題詳解
class solution 引數 路徑,選擇列表 public void backtrack int board,int row int n board row length 本行的列數 for int col 0 col n col board row col 1 backtrack board...