问题描述:
You are given a map in form of a two-dimensional integer grid where 1 represents land and 0 represents water. Grid cells are connected horizontally/vertically (not diagonally). The grid is completely surrounded by water, and there is exactly one island (i.e., one or more connected land cells). The island doesn't have "lakes" (water inside that isn't connected to the water around the island). One cell is a square with side length 1. The grid is rectangular, width and height don't exceed 100. Determine the perimeter of the island.
输入一个矩阵,1代表陆地,0代表湖泊,求岛屿周长。
Example:
思路一:
分别从上到下,从左到右,若相邻两个方块为不同属性(即一个为陆地,一个为湖泊)时,岛屿周长加1。主要边界值的处理,边界的四周均设为0即湖泊。使用异或^操作。
Code:
class Solution {
public:
int islandPerimeter(vector<vector<int>>& grid) {
int perimeter=0;
for(int i = 0; i<grid.size();i++){
int left=0;
for(int j=0; j<grid[0].size();j++){
if(left^grid[i][j]) perimeter++;
left = grid[i][j];
}
if(left^0) perimeter++;
}
for(int i = 0; i<grid[0].size();i++){
int left=0;
for(int j=0; j<grid.size();j++){
if(left^grid[j][i]) perimeter++;
left = grid[j][i];
}
if(left^0) perimeter++;
}
return perimeter;
}
};
思路二:
若不考虑陆地相邻,每块陆地的周长为4,则岛屿周长为:陆地块数*4。考虑到陆地相邻,则每两块相邻陆地使得岛屿周长减2。遍历矩阵,统计值为1的元素即陆地块数,并查找每块陆地的左边和上边是否为陆地,若是陆地,则周长减2。注意边界值的处理。
Code:
int islandPerimeter(vector<vector<int>>& grid) {
int count=0, repeat=0;
for(int i=0;i<grid.size();i++)
{
for(int j=0; j<grid[i].size();j++)
{
if(grid[i][j]==1)
{
count ++;
if(i!=0 && grid[i-1][j] == 1) repeat++;
if(j!=0 && grid[i][j-1] == 1) repeat++;
}
}
}
return 4*count-repeat*2;
}