标签:
我竟然自己一下就写对了!!!!!!
我的想法是,设置一个visited[][]记录有没有访问过这个点,然后从所有没有访问过&&是1的点出发,标记相邻的1,然后调用几次填色函数,就是有几个岛
填色的函数的内容就是,首先是把当前点标记为1,然后是对于上下左右的点,如果没有超过格子边缘&&也是1的话,就递归访问那个点
1 public int numIslands(char[][] grid) { 2 if(grid.length == 0 || grid[0].length == 0) { 3 return 0; 4 } 5 int cnt = 0; 6 int row = grid.length; 7 int col = grid[0].length; 8 boolean[][] visited = new boolean[row][col]; 9 for(int i = 0; i < row; i++) { 10 for(int j = 0; j < col; j++) { 11 if(!visited[i][j] && grid[i][j] == ‘1‘) { 12 dfs(grid, visited, i, j); 13 cnt++; 14 } 15 } 16 } 17 return cnt; 18 } 19 20 private void dfs(char[][] grid, boolean[][] visited, int row, int col) { 21 int r = grid.length; 22 int c = grid[0].length; 23 if(row >= r || col >= c) { 24 return; 25 } 26 visited[row][col] = true; 27 if(row + 1 < r && grid[row + 1][col] == ‘1‘ && !visited[row + 1][col]) { 28 dfs(grid, visited, row + 1, col); 29 } 30 if(col + 1 < c && grid[row][col + 1] == ‘1‘ && !visited[row][col + 1]) { 31 dfs(grid, visited, row, col + 1); 32 } 33 if(row > 0 && grid[row - 1][col] == ‘1‘ && !visited[row - 1][col]) { 34 dfs(grid, visited, row - 1, col); 35 } 36 if(col > 0 && grid[row][col - 1] == ‘1‘ && !visited[row][col - 1]) { 37 dfs(grid, visited, row, col - 1); 38 } 39 }
标签:
原文地址:http://www.cnblogs.com/warmland/p/5690375.html