先從乙個例題開始看一下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格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或...