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; }
标签:优先,遍历,int,DFS,field,dfs,搜索算法,dx,园子 来源: https://www.cnblogs.com/yuanjun93/p/13828489.html