DFS深度優先搜尋演算法
阿新 • • 發佈:2020-10-16
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; }