题目描述
给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域。网格中的格子水平和垂直方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。
示例
输入:[[0,1,0,0], [1,1,1,0], [0,1,0,0], [1,1,0,0]]
输出: 16
解释: 它的周长是下面图片中的 16 个黄色的边:
输入
第一行两个整数n,m,分别代表行数和列数( 1 ≤ n, m ≤ 100)
n行m列的矩阵代表二维网格地图
输出
输出岛屿的周长
例如
输入:
4 4
0 1 0 0
1 1 1 0
0 1 0 0
1 1 0 0
输出:
16
思路
首先通过遍历找到岛屿的个数,找到岛屿个数之后需要去掉重叠的边。可以通过island[i][j]&&island[i-1][j]、island[i][j]&&island[i][j-1]、island[i][j]&&island[i+1][j]、island[i][j]&&island[i][j+1]来找到边与边之间相连的岛,4*岛屿数目-边边相连的岛,即可得到答案
代码
using namespace std;
int island[101][101];
int main()
{
int n,m;
int sum=0,neighbur=0;
cin>>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
cin>>island[i][j];
if(island[i][j]==1)
sum++;
if(i&&island[i][j]&&island[i-1][j]) //注意一定要考虑i>0
neighbur++;
if(j&&island[i][j]&&island[i][j-1]) //注意一定要考虑j>0
neighbur++;
}
cout<<4*sum-2*neighbur<<endl;
}