题目1:101. 孤岛的总面积 (kamacoder.com)
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int dir[4][2] = {0,-1,-1,0,0,1,1,0};
int count = 0;
void bfs(vector<vector<int>>& map, vector<vector<bool>>& vistied, int x, int y, bool flag) {
queue<pair<int, int>> qu;
qu.push(pair<int, int>(x, y));
vistied[x][y] = true;
if(flag) map[x][y] = 0;
else count++;
while(!qu.empty()) {
pair<int, int> cur = qu.front();
qu.pop();
int newx = cur.first;
int newy = cur.second;
for(int i = 0;i < 4;i++) {
int nextx = newx + dir[i][0];
int nexty = newy + dir[i][1];
if(nextx < 0 || nextx >= map.size() || nexty < 0 || nexty >= map[0].size()) continue;
if(!vistied[nextx][nexty] && map[nextx][nexty] == 1) {
vistied[nextx][nexty] = true;
qu.push(pair<int, int>(nextx, nexty));
if(flag) map[nextx][nexty] = 0;
else count++;
}
}
}
}
int main() {
int n,m;
cin >> n >> m;
vector<vector<int>> map(n, vector<int>(m));
for(int i = 0;i < n;i++) {
for(int j = 0;j < m;j++) {
cin >> map[i][j];
}
}
vector<vector<bool>> vistied(n, vector<bool>(m, false));
for(int j = 0;j < m;j++) {
if(map[0][j] == 1 && !vistied[0][j]) bfs(map, vistied, 0, j, true);
if(map[n - 1][j] == 1 && !vistied[n - 1][j]) bfs(map, vistied, n - 1, j, true);
}
for(int i = 0;i < n;i++) {
if(map[i][0] == 1 && !vistied[i][0]) bfs(map, vistied, i, 0, true);
if(map[i][m - 1] == 1 && !vistied[i][m - 1]) bfs(map, vistied, i, m - 1, true);
}
for(int i = 0;i < n;i++) {
for(int j = 0;j < m;j++) {
if(!vistied[i][j] && map[i][j] == 1) {
// if(i != 0 && i != n - 1 && j != 0 && j != m - 1) {
// result++;
// }
bfs(map,vistied,i,j, false);
}
}
}
cout << count << endl;
return 0;
}
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int dir[4][2] = {0,-1,-1,0,0,1,1,0};
void bfs(vector<vector<int>>& map, vector<vector<bool>>& vistied, vector<vector<int>>& result, int x, int y, bool flag) {
queue<pair<int, int>> qu;
qu.push(pair<int, int>(x, y));
vistied[x][y] = true;
if(flag) map[x][y] = 0;
else result[x][y] = 0;
while(!qu.empty()) {
pair<int, int> cur = qu.front();
qu.pop();
int newx = cur.first;
int newy = cur.second;
for(int i = 0;i < 4;i++) {
int nextx = newx + dir[i][0];
int nexty = newy + dir[i][1];
if(nextx < 0 || nextx >= map.size() || nexty < 0 || nexty >= map[0].size()) continue;
if(!vistied[nextx][nexty] && map[nextx][nexty] == 1) {
vistied[nextx][nexty] = true;
qu.push(pair<int, int>(nextx, nexty));
if(flag) map[nextx][nexty] = 0;
else result[nextx][nexty] = 0;
}
}
}
}
int main() {
int n,m;
cin >> n >> m;
vector<vector<int>> map(n, vector<int>(m));
vector<vector<int>> result(n, vector<int>(m));
for(int i = 0;i < n;i++) {
for(int j = 0;j < m;j++) {
cin >> map[i][j];
result[i][j] = map[i][j];
}
}
vector<vector<bool>> vistied(n, vector<bool>(m, false));
for(int j = 0;j < m;j++) {
if(map[0][j] == 1 && !vistied[0][j]) bfs(map, vistied, result, 0, j, true);
if(map[n - 1][j] == 1 && !vistied[n - 1][j]) bfs(map, vistied, result, n - 1, j, true);
}
for(int i = 0;i < n;i++) {
if(map[i][0] == 1 && !vistied[i][0]) bfs(map, vistied, result, i, 0, true);
if(map[i][m - 1] == 1 && !vistied[i][m - 1]) bfs(map, vistied, result, i, m - 1, true);
}
for(int i = 0;i < n;i++) {
for(int j = 0;j < m;j++) {
if(!vistied[i][j] && map[i][j] == 1) {
bfs(map,vistied, result,i,j, false);
}
}
}
for(int i = 0;i < n;i++) {
for(int j = 0;j < m - 1;j++) {
cout << result[i][j] << ' ';
}
cout << result[i][m - 1] << endl;
}
return 0;
}