簡單易懂DFS 二 抽象DFS

2021-09-11 16:28:11 字數 2527 閱讀 9187

像迷宮這一類的題目使用到的dfs

dfsdf

s演算法都是比較容易想象出搜尋過程中的,而有些問題不是那麼容易就能想象出搜尋過程的,我們把這類問題稱之為抽象形式的dfs

dfsdf

s

例1:給定n

nn個整數,要求選出k

kk個數,使得選出來的k

kk個數的和為sum

sumsu

m

對於形如這樣問題,並沒有很明顯的地圖讓你來進行搜尋;但依然可以借助dfs來解決這個問題。

借助上面的dfs

dfsdf

s思想,可以寫出如下**:

#include

using namespace std;

int a[40]

;int n, k, sum, ans;

//i表示選擇第i個數,cnt記錄選擇的個數,s表示選取數的和

void

dfs(

int i,

int cnt,

int s)

return;}

dfs(i +

1, cnt, s)

;//不選該數

dfs(i +

1, cnt +

1, s + a[i]);

//選擇該數

}int

main()

ans =0;

dfs(0,

0,0)

; cout << ans << endl;

return0;

}

inp

utinput

input:

5 3 9

1 2 3 4 5

out

putoutput

output

:

例2:n

nn皇后問題

n

nn皇后問題是乙個經典的問題,在乙個n∗n

n * n

n∗n的棋盤上放置n個皇后,每行港後放置乙個並使其不能互相攻擊(同一行,同一列、同一斜線上的皇后都會自動攻擊)

上圖就是乙個合法的8皇后的解。n皇后問題是指:計算一共有多少種的方法放置n個皇后

這道題也可以借助dfs

dfsdf

s的思想,即先判斷第一行填充哪些位置,然後根據第一行填充的位置將棋盤上不能填充的位置標記(不能同一行、同一列、同一斜線),再填充下一行,每次根據之前狀態的填充位置進行填充下一行,直到每一行都有皇后為止。

標記棋盤上不能填充的位置,可以使用下面這種比較巧妙地方法:

//col標記列,x1標記正斜線,x2標記反斜線

int col[10]

, x1[20]

, x2[20]

;col[i]

= x1[r + i]

= x2[r - i + n]

= true;

//r表示填充第r行,(r, i)表示放置的位置,r + i 表示正斜線,r - i + n表示反斜線

//可以簡單的推理一下,每一條正斜線的r + i都相等,反斜線的r - i都相等,為了

//防止負數,加乙個n確保其為正數

然後根據上面的思路,可以寫出如下**:

#include

using namespace std;

int n;

int ans;

bool col[10]

, x1[20]

, x2[20]

;bool check

(int r,

int i)

void

dfs(

int r)

for(

int i =

0; i < n;

++i)}}

intmain()

inp

utinput

input:

out

putoutput

output

:

inp

ut1input1

input1

:

out

put2

output2

output

2:

理解抽象形式的dfs

dfsdf

s的問題求解,有助於加強對於dfs

dfsdf

s的理解

理解了n

nn皇后問題的求解可以嘗試2n2n

2n

dfs簡單總結

介紹 dfs中文名 先深搜尋 說得通俗點就是一搜到底,不撞南牆不回頭 如上圖,dfs搜尋次序為1 2 3到頭之後,回到2,然後到4,此時有兩個方向可走,乙個是3,乙個是5,因為3已搜過,那麼只有搜5了,此時所有節點全部遍歷完。dfs一般用遞迴來實現,格式如下 dfs px 結束條件 for pn 應...

dfs簡單題目

1 桐桐的全排列 可在 中國石油acm網 提交 description 今天,桐桐的老師布置了一道數學作業,要求列出所有從數字1到數字n的連續自然數的排列,要求所產生的任一數字 序列中不允許出現重複的數字。因為排列數很多,桐桐害怕寫漏了,所以她決定用計算機程式設計來解決。input 只有乙個整數n ...

組合 DFS 簡單

description 問題很簡單,給你n個正整數,求出這n個正整數中所有任選k個相乘後的和。input 輸入有兩行,第一行是兩個整數n和k,其中1 k n 10。接下去一行就是n個正整數,保證最後結果用long即可儲存。output 輸出只有乙個正整數,為最後的和。sample input 4 2...