學習記錄 DFS的聯通塊與計數 剪枝

2022-08-01 08:12:11 字數 1693 閱讀 3057

1 #include 2

using

namespace

std;

3const

int maxn=1000;4

intn,m;5//

地圖尺寸

6int maap[maxn+10][maxn+10];7

//查詢零一地圖中的1聯通塊個數

8bool vis[maxn+10][maxn+10];9

int direx=;

10int direy=;

11//

四向聯通

12void dfs(int x,int

y)1325}

26}27int

main()

2837 }//

輸入38

for(int i=1;i<=n;i++)

3947

}48 }//

dfs計數模組,不能把它直接加在輸入環節!!

49//

不然地圖都沒輸入完求個啥的聯塊!!

50 cout51 }

1 #include 2

using

namespace

std;

3const

int maxn=1000;4

int maap[maxn+10][maxn+10];5

//零一迷宮的最短路問題(不剪枝優化)6//

0是障礙,1是道路

7bool vis[maxn+10][maxn+10];8

//訪問標記

9int direx=;

10int direy=;

11//

四向聯通

12int

n,m;

13//

地圖尺寸

14int

stx,sty,edx,edy;

15//

起點終點座標

16int

minstep;

17//

最少步數(初始化為矩陣內遍歷步數)

18void dfs(int x, int y, int

step)

1929

for(int i = 0; i < 4; i++)

3038

}39 vis[x][y] = false;//

回溯40}41

intmain()

4251

}52 cin>>stx>>sty>>edx>>edy;//

輸入53 dfs(stx,sty,0

);54

//深搜

55 cout56return0;

57 }

1

void dfs(int x, int y, int

step)28

/*********************************

*/9 vis[x][y] = true;10

//打訪問標記

11if(x == edx && y ==edy)

12//

到達終點

1318

for(int i = 0; i < 4; i++)

1927

}28 vis[x][y] = false;//

回溯29 }

學習記錄 BFS的聯通塊與計步

1 include 2 using namespace std 3struct node 7 queueq 8const int maxn 200 9 intmaap maxn maxn 10bool book maxn maxn 11int m,n 12int next 4 2 18void bf...

bzoj4401 塊的計數 dfs

首先隨便選乙個根進行dfs得到size x 表示以x為根節點的子樹的大小。然後我們假設答案為t,需要判斷t是否可行。首先顯然需要t n。顯然每乙個塊有且僅有乙個根,定義為這個塊的最高點。然後我們發現乙個點x是塊的根的必要條件是t size x 這個是顯然的。然後我們統計有多少個size x 被t整除...

2017 9 26 塊的計數 思考記錄

這種題就屬於那種描述很簡單,要求很簡單,但就是無從下手的題 這個題我只有n根n做法 列舉因數檢驗。首先對於任何塊的大小,方案唯一,這是顯然的,如果劃分位置改變1,一定有乙個位置 1,乙個位置 1,不符題意 然後我們還需要發現乙個性質,如果能分成大小為n的塊,子樹節點數的數量是n的倍數的數量一定為總點...