Island Perimeter (下)

class Solution {
public:
    int islandPerimeter(vector>& grid) {
        
     if(grid.size()==0|| grid[0].size()==0) return 0;  
     int a= grid.size();
     int b= grid[0].size();
     int result=0;     
     for(int i=0;i        {
        for(int j=0;j          {
            if (grid[i][j]==0)
            break;
            result+=4;
           if(i>0&&grid[i-1][j]!=0&&grid[i][j])
              result-=2;
           if(j>0&&grid[i][j-1]!=0&&grid[i][j])
              result-=2;   
      }   
    } 
        return result;
    }

};


答案一直是10,不知道问题在哪。


根据12,和博客:https://www.cnblogs.com/grandyang/p/6096138.html

Example:

[[0,1,0,0],
 [1,1,1,0],
 [0,1,0,0],
 [1,1,0,0]]

Answer: 16
Explanation: The perimeter is the 16 yellow stripes in the image below:

Island Perimeter (下)_第1张图片

 

这道题给了我们一个格子图,若干连在一起的格子形成了一个小岛,规定了图中只有一个相连的岛,且岛中没有湖,让我们求岛的周长。我们知道一个格子有四条边,但是当两个格子相邻,周围为6,若某个格子四周都有格子,那么这个格子一条边都不算在周长里。那么我们怎么统计出岛的周长呢?第一种方法,我们对于每个格子的四条边分别来处理,首先看左边的边,只有当左边的边处于第一个位置或者当前格子的左面没有岛格子的时候,左边的边计入周长。其他三条边的分析情况都跟左边的边相似,这里就不多叙述了,参见代码如下:

 

解法一:

复制代码
class Solution {
public:
    int islandPerimeter(vectorint>>& grid) {
        if (grid.empty() || grid[0].empty()) return 0;
        int m = grid.size(), n = grid[0].size(), res = 0;
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (grid[i][j] == 0) continue;
                if (j == 0 || grid[i][j - 1] == 0) ++res;
                if (i == 0 || grid[i - 1][j] == 0) ++res;
                if (j == n - 1 || grid[i][j + 1] == 0) ++res;
                if (i == m - 1 || grid[i + 1][j] == 0) ++res;
            }
        }
        return res;
    }
};
复制代码

 

下面这种方法对于每个岛屿格子先默认加上四条边,然后检查其左面和上面是否有岛屿格子,有的话分别减去两条边,这样也能得到正确的结果,参见代码如下:

 

解法二:

复制代码
class Solution {
public:
    int islandPerimeter(vectorint>>& grid) {
        if (grid.empty() || grid[0].empty()) return 0;
        int res = 0, m = grid.size(), n = grid[0].size();
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (grid[i][j] == 0) continue;
                res += 4;
                if (i > 0 && grid[i - 1][j] == 1) res -= 2;
                if (j > 0 && grid[i][j - 1] == 1) res -= 2;
            }
        }
        return res;
    }
};


根据第二个方案知道 用continue!!!!!!!!!!!!



break和continue都是用来控制循环结构的,主要是停止循环。

1.break

有时候我们想在某种条件出现的时候终止循环而不是等到循环条件为false才终止。

这是我们可以使用break来完成。break用于完全结束一个循环,跳出循环体执行循环后面的语句。

2.continue

continue和break有点类似,区别在于continue只是终止本次循环,接着还执行后面的循环,break则完全终止循环。

可以理解为continue是跳过当次循环中剩下的语句,执行下一次循环

所以,break时候,每次为0时跳出内循环,

4+4-2-2+4-2+4+4-2-2=10.


class Solution {
public:
    int islandPerimeter(vector>& grid) {
        
     if(grid.size()==0|| grid[0].size()==0) return 0;  
     int a= grid.size();
     int b= grid[0].size();
     int result=0;     
     for(int i=0;i0&&grid[i-1][j]!=0&&grid[i][j])
              result-=2;
           if(j>0&&grid[i][j-1]!=0&&grid[i][j])
              result-=2;   
      }   
    } 
        return result;
    }
};




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