暑期DFS相關練習

2021-10-08 13:52:17 字數 1413 閱讀 9109

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 ...