1. 程式人生 > 實用技巧 >DFS深度優先搜尋演算法

DFS深度優先搜尋演算法

Lake Counting(POJ No.2386)

有一個大小為N*M的園子,雨後積起了水。八連通的積水被認為是在一起的。請求出園子裡共有多少個水窪?(八連通是指下圖中相對w的*部分)

* * *

*w*

* * *

限制條件 N,M ≤ 100

思路:

先遍歷整個園子,從任意的w開始,把周圍所有的w都變成 '.' ,然後遍歷完成之後 res 加1

dfs中的操作就是先把當前位置改為'.',然後再把周圍上下左右鄰近的8個位置全部遍歷一遍找w,找到w就從那個w的位置再開始周圍8個位置的尋找,一直到周圍的w找完為止

int N = 10;
int M = 12;
char field[10][12] = {
    {
'w','.','.','.','.','.','.','.','.','w','w','.'}, {'.','w','w','w','.','.','.','.','.','w','w','w'}, {'.','.','.','.','w','w','.','.','.','w','w','.'}, {'.','.','.','.','.','.','.','.','.','w','w','.'}, {'.','.','.','.','.','.','.','.','.','w','.','.'}, {'.','.','w','.','.','.','
.','.','.','w','.','.'}, {'.','w','.','w','.','.','.','.','.','w','w','.'}, {'w','.','w','.','w','.','.','.','.','.','w','.'}, {'.','w','.','w','.','.','.','.','.','.','w','.'}, {'.','.','w','.','.','.','.','.','.','.','w','.'}, }; void dfs(int x, int y) { field[x][y] = '.';
for (int dx = -1; dx <= 1; dx++) { for (int dy = -1; dy <= 1; dy++) { int nx = x + dx; int ny = y + dy; if (field[nx][ny] == 'w') { dfs(nx, ny); } } } } int solve() { int res = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { if (field[i][j] == 'w') { dfs(i, j); res++; } } } return res; }