Island Perimeter

题目来源
一道简单题,我竟然做了半个多小时,用的最笨的方法。
先找到一块陆地,然后在深度优先遍历,计算。
我一开始没有想到边界上的边也算边,然后耽误了一些时间。

class Solution {
public:
    int islandPerimeter(vector>& grid) {
        int m = grid.size();
        if (m == 0)
            return 0;
        int n = grid[0].size();
        for (int i=0; i>& grid, int x, int y)
    {
        int res = 0;
        int a[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
        grid[x][y] = -1;
        for (int i=0; i<4; i++) {
            int tmpx = x + a[i][0];
            int tmpy = y + a[i][1];
            if (tmpx == -1 || tmpx == grid.size() || tmpy == -1 || tmpy == grid[0].size() || grid[tmpx][tmpy] == 0)
                res++;
            if (tmpx >= 0 && tmpx < grid.size() && tmpy >= 0 && tmpy < grid[0].size() && grid[tmpx][tmpy] == 1)
                res += dfs(grid, tmpx, tmpy);
        }
        return res;
    }
};

看了看提示,说用哈希,不过没想到应该怎么用。然后看了下讨论,发现了一个好idea。就是遍历,计算有多少块陆地,然后对于每块陆地,看看他的右边和下边是否是陆地,是的话就减去两条边,否则的话就是四条边。
代码如下:

class Solution {
public:
    int islandPerimeter(vector>& grid) {
        int m = grid.size();
        if (m == 0)
            return 0;
        int n = grid[0].size();
        int island = 0;
        int neighbor = 0;
        for (int i=0; i

你可能感兴趣的:(Island Perimeter)