Fork me on GitHub

深度优先搜索

基本概念

深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。属于盲目搜索。

例题:岛屿的个数

给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。

示例 1:

1
2
3
4
5
6
7
输入:
11110
11010
11000
00000

输出: 1

示例 2:

1
2
3
4
5
6
7
输入:
11000
11000
00100
00011

输出: 3

解决方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Solution {
// DFS
public int numIslands(char[][] grid) {
if(grid.length==0||grid[0].length==0)
return 0;
int res = 0;
int row = grid.length;
int col = grid[0].length;
for(int i = 0; i < row; i++){
for(int j = 0; j < col; j++){
if(grid[i][j]=='1'){
res++;
dfs(grid, i, j,row,col);
}
}
}
return res;
}
private void dfs(char[][] grid, int i, int j, int row, int col){
if(i<0 || i>=row || j<0 || j>=col || grid[i][j]=='0'){
return;
}
grid[i][j] = '0';
dfs(grid, i-1, j, row, col);
dfs(grid, i+1, j, row, col);
dfs(grid, i, j-1, row, col);
dfs(grid, i, j+1, row, col);
}
}