200. Number of Islands

我竟然自己一下就写对了!!!!!!

我的想法是,设置一个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     }

 

posted @ 2016-07-21 07:47  warmland  阅读(150)  评论(0编辑  收藏  举报