八皇后問題 DFS和遞迴

2021-10-02 16:46:38 字數 1886 閱讀 8331

先從乙個例題開始看一下dfs遞迴的使用

給定乙個整數n,將數字1~n排成一排,將會有很多種排列方法。

現在,請你按照字典序將所有的排列方法輸出。

輸入格式

共一行,包含乙個整數n。

輸出格式

按字典序輸出所有排列方案,每個方案佔一行。

資料範圍

1≤n≤7

輸入樣例:

3輸出樣例:

1 2 3

1 3 2

2 1 3

2 3 1

3 1 2

3 2 1

#include

using

namespace std;

const

int n =10;

int n;

int path[n]

;bool st[n]

;void

dfs(

int u)

for(

int i =

1; i <= n; i ++)}

}int

main()

在棋盤上放置8個皇后,使它/們互不攻擊,此時每個皇后的攻擊範圍為同行同列和同對角線,所以不能讓它們處於同行、同列和同對角線。輸出所有情況的棋盤。**

當把問題分成若干步驟並遞迴求解時,如果當前步驟沒有合法選擇,則函式將返回上一級遞迴呼叫 ,這種現象稱為回溯。正因為這個原因,遞迴列舉演算法常被成為回溯法。

解題思路就是按行列舉q, 然後遞迴出其他皇后。

n-皇后問題是指將 n 個皇后放在 n∗n 的西洋棋棋盤上,使得皇后不能相互攻擊到,即任意兩個皇后都不能處於同一行、同一列或同一斜線上。

現在給定整數n,請你輸出所有的滿足條件的棋子擺法。

輸入格式

共一行,包含整數n。

輸出格式

每個解決方案佔n行,每行輸出乙個長度為n的字串,用來表示完整的棋盤狀態。

其中」.」表示某乙個位置的方格狀態為空,」q」表示某乙個位置的方格上擺著皇后。

每個方案輸出完成後,輸出乙個空行。

資料範圍

1≤n≤9

輸入樣例:

4輸出樣例:

.q……q

q……q.

…q.q…

…q.q…

#include

using

namespace std;

const

int n =20;

int n;

char g[n]

[n];

bool col[n]

,dg[n]

,bdg[n]

;//列,對角線。反對角線

void

dfs(

int u)

for(

int i =

0;i < n; i ++)if

(!col[i]

&&!dg[u + i]

&&!bdg[n - u + i]

)//剪枝

}int

main()

演算法的複雜度:o( n ! ),每行每行的放皇后,複雜度o(n),檢查衝突o(n).當n=10時,已經達千萬數量級。當n > 11的n皇后問題,需要用新方法。

八皇后問題 DFS

古老而且典型的回溯問題 八皇后問題 找了採用深度優先 進行實現 思路 一 首先 需要 乙個判斷該位置能不能放的問題 1 乙個同一行 肯定不能放 並且 mat i col 問題了 2 左斜向上的部分肯定不能放 因為這裡是從0 行開始的 先卡第一行 在看第二行 要是左斜向上 有皇后 那麼這個位置不能放 ...

八皇后問題(dfs)

八皇后問題,是乙個古老而著名的問題,是搜尋演算法的經典案例。該問題是國際西洋棋棋手馬克思貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后。使其不能相互攻擊,即任意兩個皇后都不能處於同一行 同一列或者同一斜線,問有多少中擺法。分析 用dfs一行一行得進行擺放,用for迴圈來確定每一列,由於是一...

八皇后問題 dfs

一 題意解析 西洋棋中的皇后,可以橫向 縱向 斜向移動。如何在乙個8x8的棋盤上放置8個皇后,使得任意兩個皇后都不在同一條橫線 豎線 斜線方向上?八皇后問題是乙個古老的問題,於1848年由一位西洋棋棋手提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或...