淺談DFS(上)
阿新 • • 發佈:2022-03-26
前言
到底有什麼前言呢?
板子
void dfs(int x) {
if (x == 某個條件) {
//輸出
puts("");
return;
}
for (int ; ; ) {
if () {
st[i] = 1;
//按照操作執行
dfs(x + 1);
st[i] = 0;
//歸0
}
}
}
來看看 DFS 一道經典的 n 皇后問題:
n皇后問題是指將 n 個皇后放在 n×n 的國際象棋棋盤上,
使得皇后不能相互攻擊到,
即任意兩個皇后都不能處於同一行、同一列或同一斜線上。
現在給定整數 n,請你輸出所有的滿足條件的棋子擺法。
這道題目其實是可以優化一下的,具體請看下面的程式碼實現部分 qwq
#include <iostream> using namespace std; int n; char a[10001][10001]; int c[100001], r[100001], u[100001]; void dfs(int x) { if (x == n) { //輸出 for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { cout << a[i][j]; } cout << endl; } puts(""); return; } for (int i = 1; i <= n; i++) { if (c[i] == 0 && r[x + i] == 0 && u[n - x + i] == 0) { a[x][i] = 'Q'; //可以放皇后 c[i] = r[x + i] = u[n - x + i] = 1; dfs(x + 1); c[i] = r[x + i] = u[n - x + i] = 0; a[x][i] = '.'; } } } int main() { cin >> n; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { a[i][j] = '.'; } } dfs(0); return 0; }
樹上操作同理。