ytu 1789 n皇后問題(水題,列舉)

2021-09-06 13:05:34 字數 1496 閱讀 7455

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