给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域。
网格中的格子水平和垂直方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。
岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。
示例 :
1 2 3 4 5 6 7 8 9
| 输入: [[0,1,0,0], [1,1,1,0], [0,1,0,0], [1,1,0,0]] 输出: 16
解释: 它的周长是下面图片中的 16 个黄色的边:
|
思路:
每个陆地能贡献出的周长取决于周围格子是否为以下两种状态:
所以我们遍历整个数组,记录每个陆地所能贡献出的周长,累加即可。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| class Solution { public:
int dx[4] = {0, 1, 0, -1}; int dy[4] = {-1, 0, 1, 0};
int islandPerimeter(vector<vector<int>>& grid) {
int res = 0;
for(int i = 0; i < grid.size(); i++){
for(int j = 0; j < grid[i].size(); j++){
if(grid[i][j]){
int cnt = 0;
for(int k = 0; k < 4; k++){
int x = j + dx[k]; int y = i + dy[k];
if(x < 0 || x >= grid[i].size() || y < 0 || y >= grid.size() || !grid[y][x]) cnt++; }
res += cnt; } } } return res; } };
|