cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
int n, m;
cin >> n >> m;
vector<vector<int>> mp(n, vector<int>(m, 0));
for (int i = 0; i < n; i++){
for (int j = 0; j < m; j++){
cin >> mp[i][j];
}
}
int landNum = 0;
int neighborNum = 0;
for (int i = 0; i < n; i++){
for (int j = 0; j < m; j++){
if (mp[i][j] == 1){
landNum++;
if (i < n - 1){
if (mp[i + 1][j] == 1) neighborNum++;
}
if (j < m - 1){
if (mp[i][j + 1] == 1) neighborNum++;
}
}
}
}
cout << (4 * landNum - 2 * neighborNum);
return 0;
}
这题没必要用图的遍历算法,直接遍历一遍更加简单,且时间复杂度差不多,不过也还是可以有巧思。笔者更喜欢随想录所提的第二种算法,一个陆地有4条边,如果与别的陆地相邻,那就有两条陆地的边不是岛的边缘,所以遍历中只需要关注陆地的数量,以及陆地的邻接数量就可以轻松的得到答案,也就是4 * landNum - 2 * neighborNum