1.題目描述
2.思路
(1)主函數,存儲圖結構
(2)主函數,visit數組表示已訪問過的元素
(3)輔助函數,用遞歸(深搜),遍歷以已訪問過的元素(陸地1)的相鄰元素(陸地1)。
補充:深度搜索(遞歸)
(1)確定遞歸函數和參數
(2)確定終止條件
(3)單層搜索條件
3.代碼實現
public int numIslands(char[][] grid) {//行數int row = grid.length;//列數int col = grid[0].length;// visited 用于記錄訪問狀態boolean[][] visited = new boolean[row][col];//所有數組的元素在創建時都會被自動初始化為默認值。//島嶼數量初始化int cnt = 0;//判空處理,整個圖為null,行為0,列為0if (row == 0 || col == 0 || grid == null) {return 0;}//存儲圖結構for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) { // 如果當前是陸地且未被訪問if (grid[i][j] == '1' && visited[i][j] == false)//!visited[i][j] 和visited[i][j]==false 等同{cnt++;dfs(grid, visited, i, j);// 每次DFS表示一個島嶼}}}return cnt;}// 深度優先搜索,將與當前位置相連的陸地都標記為已訪問void dfs(char[][] grid, boolean visited[][], int i, int j) {int row = grid.length;int col = grid[0].length;// 越界或不是陸地或已訪問,直接返回,切記因為索引是從0開始的,所以i>=row||j>=colif (i < 0 || j < 0 || i >= row || j >= col || visited[i][j] == true || grid[i][j] == '0') {return;}// 標記為已訪問,把訪問過的陸地的相鄰陸地標記為已訪問過visited[i][j] = true;dfs(grid, visited, i + 1, j);dfs(grid, visited, i - 1, j);dfs(grid, visited, i, j + 1);dfs(grid, visited, i, j - 1);}public static void main(String[] args) {H200 test = new H200();char[][] input = {{'1', '1', '1', '1', '0'},{'1', '1', '0', '1', '0'},{'1', '1', '0', '0', '0'},{'0', '0', '0', '0', '0'}};int numsIsland = test.numIslands(input);System.out.print(numsIsland);}