题目来源:106. 岛屿的周长
C++题解1:遍历一遍,找每个单元格的临水周长。
#include <iostream>
#include <vector>
using namespace std;
int main() {
int N, M; cin>>N>>M;
vector<vector<int>> grid(N, vector<int>(M, 0));
for(int i = 0; i < N; i++) {
for(int j = 0; j < M; j++) {
cin>>grid[i][j];
}
}
int res = 0;
for(int i = 0; i < N; i++) { // 中间
for(int j = 0; j < M; j++) {
if(grid[i][j] == 1){
if(i == 0) res = res+1;
else if(grid[i-1][j] == 0) res++;
if(i == N-1) res++;
else if(grid[i+1][j] == 0) res++;
if(j == 0) res++;
else if(grid[i][j-1] == 0) res++;
if(j == M-1) res++;
else if(grid[i][j+1] == 0) res++;
}
}
}
cout<<res;
return 0;
}
C++题解2(来源代码随想录):计算岛屿单元个数,有4个边,每两两相邻的消掉2个边。
那么只需要在计算出相邻岛屿的数量就可以了,相邻岛屿数量为cover。
结果 result = 岛屿数量 * 4 - cover * 2。
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> grid(n, vector<int>(m, 0));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> grid[i][j];
}
}
int sum = 0; // 陆地数量
int cover = 0; // 相邻数量
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (grid[i][j] == 1) {
sum++; // 统计总的陆地数量
// 统计上边相邻陆地
if(i - 1 >= 0 && grid[i - 1][j] == 1) cover++;
// 统计左边相邻陆地
if(j - 1 >= 0 && grid[i][j - 1] == 1) cover++;
// 为什么没统计下边和右边? 因为避免重复计算
}
}
}
cout << sum * 4 - cover * 2 << endl;
}