像迷宮這一類的題目使用到的dfs
dfsdf
s演算法都是比較容易想象出搜尋過程中的,而有些問題不是那麼容易就能想象出搜尋過程的,我們把這類問題稱之為抽象形式的dfs
dfsdf
s
例1:給定n對於形如這樣問題,並沒有很明顯的地圖讓你來進行搜尋;但依然可以借助dfs來解決這個問題。nn個整數,要求選出k
kk個數,使得選出來的k
kk個數的和為sum
sumsu
m
借助上面的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 9out1 2 3 4 5
putoutput
output
:
例2:n這道題也可以借助dfsnn皇后問題
n
nn皇后問題是乙個經典的問題,在乙個n∗n
n * n
n∗n的棋盤上放置n個皇后,每行港後放置乙個並使其不能互相攻擊(同一行,同一列、同一斜線上的皇后都會自動攻擊)
上圖就是乙個合法的8皇后的解。n皇后問題是指:計算一共有多少種的方法放置n個皇后
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:
outputoutput
output
:
input1input1
input1
:
output2
output2
output
2:
理解抽象形式的dfsdfsdf
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...