DFS求島的個數LeetCode 200. Number of Islands

深度優先搜索算法(Depth-First-Search),是搜索算法的一種。它沿着樹的深度遍歷樹的節點,儘量深的搜索樹的分 支。當節點v 的全部邊都己被探尋過,搜索將回溯到發現節點v的那條邊的起始節點。這一過程一直進行到已發現從源節點可達的全部節點爲止。若是還存在未被發現的節點,則選擇其中一個做爲源節點並重復以上過程,整個進程反覆進行直到全部節點都被訪問爲止。DFS屬於盲目搜索。java


算法步驟:
1. 訪問頂點v;
2. 依次從v的未被訪問的鄰接點出發,對圖進行深度優先遍歷;直至圖中和v有路徑相通的頂點都被訪問;
3. 若此時圖中尚有頂點未被訪問,則從一個未被訪問的頂點出發,從新進行深度優先遍歷,直到圖中全部頂點均被訪問過爲止
算法


200. Number of Islandsspa

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 watercode

給出一個2維矩陣, 其中'1'表明陸地, '0'表明水, 求島(由鏈接在一塊兒的陸地組成)的個數orm


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);
 }
相關文章
相關標籤/搜索