dfs就是從起點出發,走過的要做標記
, 從沒有標記的點中隨意挑一 個往前走,走不了就回退,此種路徑搜尋策略就稱為「深度
優先搜尋」,簡稱「深搜」。就是典型的不撞南牆不回頭。
其實dfs就是邏輯的建立的過程 比如說選擇乙個物品後我們進行下乙個物品的選擇,但是我們也可以不選擇的這個物品然後繼續下乙個物品的選擇,所以有個恢復現場的步驟。
有關dfs 的習題
習題連線:
dfs一定要進行標記,還有注意判斷條件發,防止越界
code:
#include#includeusing namespace std;
const int n=120;
int n,m;
char ma[n][n];
bool vis[n][n];
int to[8][2]=;
bool check(int x,int y)
if(row==n) return;
for(int j=0;j思路:跟棋盤問題差不多就是多了個條件
#include#include#include#includeusing namespace std;
const int n=11;
int col[n];
int n;
int ans[n];
int cnt=0;
bool check(int x)
// }
// dfs(row+1,num);//沒有這種不選的情況,因為每一行必須有乙個皇后
//}//第二種
void dfs(int row)
for(int j=1;j<=n;j++) }}
int main()
while(~scanf("%d",&n)&&n)
return 0;
}
思路:只要最小的轉彎次數小於k 就輸出yes,所以在dfs 的時候需要剪枝,剪去大於最小次數的所有次數
code:
#include#include#include#define inf 0x3f3f3f3f
using namespace std;
char ma[110][110];
int min[110][110];
int to[4][2]=;
bool flag;
int x1,y1,x2,y2,k;
int n,m;
bool check(int x ,int y,int temp)
for(int i=0;i<4;i++) }}
int main()
}
DFS相關練習
對於深度優先遍歷,可以用遞迴來實現。遞迴有兩個關鍵點 1.遞迴分支 2.遞迴邊界 回顧斐波那契數列 f 0 1,f 1 1,f n f n 1 f n 2 n 2 每當求f n 時,將其分為f n 1 和f n 2 對f n 1 與f n 2 又可以再分,直到分到最底層的f 0 和f 1 這時候便開...
dfs相關練習題
給定整數序列a1,a2,an,判斷是否可以從中選出若干個數,使它們的和恰好為k 輸入 n 4 a k 13 輸出 yes 13 2 4 7 public class 部分和 int k sc.nextint kk k dfs a,k,0,newarraylist public static void...
練習記錄 dfs序)
牛客每日一題 根據根右左的遍歷順序的到dfs序,再求lis即為可以選到的最多點。利用dfs序維護每種顏色的樹,大佬部落格 需要注意的是當只能取同一邊的兩個點時,要取dfs序差值最大的兩個點,可以想出反例,但不會證明。includeusing namespace std const int maxn ...