DFS求岛的个数LeetCode 200. Number of Islands

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

算法步骤:
1. 访问顶点v;
2. 依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;
3. 若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止

200. Number of Islands

Descriptor:Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water

给出一个2维矩阵, 其中'1'代表陆地, '0'代表水, 求岛(由连接在一起的陆地组成)的个数

public int numIslands(char[][] grid) {
  // 设置岛的个数初值为0
  int answer = 0;
  // 遍历这个2维矩阵, 对于每一个点为'1'(陆地), 进行深度优先搜索
  for (int i = 0; i < grid.length; ++i) {
   for (int j = 0; j < grid[i].length; ++j) {
    if (grid[i][j] == '1') {
     DFS(grid, i, j);
     ++answer;// 搜索完成, 岛的个数加1;
    }
   }
  }
  return answer;
 } 
 
 public void DFS(char[][] grid, int x, int y) {
  // 判断是否越界, 并判断当前元素是否满足搜索条件
  if (x < 0 || x >= grid.length || y < 0 || y >= grid[x].length || grid[x][y] != '1')
   return;// 不满足条件的点, 直接返回
  // 当前点已经搜索,设为'0', 避免重复搜索导致死循环
  grid[x][y] = '0';
  // 对上方点做递归深度优先搜索
  DFS(grid, x - 1, y);
  // 对下方点做递归深度优先搜索
  DFS(grid, x + 1, y);
  // 对左边方点做递归深度优先搜索
  DFS(grid, x, y - 1);
  // 对右边方点做递归深度优先搜索
  DFS(grid, x, y + 1);
 }

你可能感兴趣的:(DFS,图搜索,深度优先搜索)