码迷,mamicode.com
首页 > 其他好文 > 详细

01点阵地图,数出有多少个岛屿。

时间:2015-04-14 01:57:22      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:

计数的一些岛屿。一个岛,四面环水,是通过连接相邻的土地横向或纵向的形成。你可以假设所有四个边的网格都是被水包围。

1.检测是否被访问过了,如果是设置成x,然后取到下一格。

2.检查是否为1,如果不是,把它设置成已经访问过的,为x。

3.发现每一个岛中的1,然后增加岛的数目numisland,

  去往从头开始的每个1,将它设置成已经访问过的,即设置成x

4.返回numisland。

时间复杂度为N,当n为矩阵的大小

空间复杂度为1,因为我们把它当作已访问的列表复用了矩阵。

 

 

 1     public class Solution {
 2 
 3     private void discoverIsland(char[][] g, int h, int w, int x, int y)
 4     {
 5       if( x < 0 || y < 0 || x >= h || y >= w ) return;
 6 
 7       if( g[x][y] == ‘x‘ || g[x][y] == ‘0‘ ) return;
 8 
 9       g[x][y] = ‘x‘;
10 
11       discoverIsland(g,h,w,x+1,y);
12       discoverIsland(g,h,w,x,y+1);
13       discoverIsland(g,h,w,x-1,y);
14       discoverIsland(g,h,w,x,y-1);
15     }
16 
17     public int numIslands(char[][] grid) {
18 
19       if( grid.length == 0 ) return 0;
20 
21       int numIslands = 0;
22       int rows = grid.length;
23       int cols = grid[0].length;
24       for( int i=0; i<rows; i++ )
25       {
26           for( int j=0; j<cols; j++ )
27           {
28               if( grid[i][j] == ‘x‘ ) continue;
29 
30               if( grid[i][j] == ‘1‘ )
31               {
32                   discoverIsland(grid, rows, cols, i, j);
33                   numIslands++;
34               }
35               else
36               {
37                   grid[i][j] = ‘x‘;
38               }
39           }
40       }
41 
42       return numIslands;
43     }
44 
45     }

 

public class Solution {
    void findIsland(char[][] grid, int x, int y, HashSet<Integer> used) {
        int tag = 0;
        int rows = grid.length;
        int columns = grid[0].length;
        // up
        if (x > 0 && grid[x - 1][y] == ‘1‘) {
            tag = (x - 1) * columns + y;
            if (!used.contains(tag)) {
                used.add(tag);
                findIsland(grid, x - 1, y, used);
            }
        }
        // right
        if ( y < (columns - 1) && grid[x][y + 1] == ‘1‘) {
            tag = x * columns + y + 1;
            if (!used.contains(tag)) {
                used.add(tag);
                findIsland(grid, x, y + 1, used);
            }
        }
        // down
        if (x < (rows - 1) && grid[x + 1][y] == ‘1‘) {
            tag = (x + 1) * columns + y;
            if (!used.contains(tag)) {
                used.add(tag);
                findIsland(grid, x + 1, y, used);
            }
        }
        // left
        if(y > 0 && grid[x][y - 1] == ‘1‘) {
            tag = x * columns + y - 1;
            if (!used.contains(tag)) {
                used.add(tag);
                findIsland(grid, x, y - 1, used);
            }
        }
    }

    public int numIslands(char[][] grid) {
        if (grid == null || grid.length == 0) {
            return 0;
        }
        int result = 0;
        int rows = grid.length;
        int columns = grid[0].length;
        HashSet<Integer> used = new HashSet<Integer>();
        for (int i = 0; i < rows; ++i) {
            for (int j = 0; j < columns; ++j) {
                if (grid[i][j] == ‘1‘) {
                    int tag = i * columns + j;
                    if (!used.contains(tag)) {
                        used.add(tag);
                        result ++;
                        findIsland(grid, i, j, used);
                    }
                }
            }
        }
        return result;
    }
}

  

01点阵地图,数出有多少个岛屿。

标签:

原文地址:http://www.cnblogs.com/nero-bupt/p/4423759.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!