本文最后更新于585 天前,其中的信息可能已经过时,如有错误请发送邮件到tomding1065@gmail.com
https://www.programmercarl.com/kamacoder/0102.%E6%B2%89%E6%B2%A1%E5%AD%A4%E5%B2%9B.html
1.本题思路和上一题相似,这里借用代码随想录的思路:
这道题目和0101.孤岛的总面积 (opens new window)正好反过来了,0101.孤岛的总面积 (opens new window)是求 地图中间的空格数,而本题是要把地图中间的 1 都改成 0 。
那么两题在思路上也是差不多的。
思路依然是从地图周边出发,将周边空格相邻的陆地都做上标记,然后在遍历一遍地图,遇到 陆地 且没做过标记的,那么都是地图中间的 陆地 ,全部改成水域就行。
有的录友可能想,我在定义一个 visited 二维数组,单独标记周边的陆地,然后遍历地图的时候同时对 数组board 和 数组visited 进行判断,决定 陆地是否变成水域。
这样做其实就有点麻烦了,不用额外定义空间了,标记周边的陆地,可以直接改陆地为其他特殊值作为标记。
步骤一:深搜或者广搜将地图周边的 1 (陆地)全部改成 2 (特殊标记)
步骤二:将水域中间 1 (陆地)全部改成 水域(0)
步骤三:将之前标记的 2 改为 1 (陆地)
一开始我也是想定义一个visited数组进行记录。
CPP
#include<bits/stdc++.h>
using namespace std;
int dir[4][2] = {1,0,0,1,0,-1,-1,0};
void dfs(vector<vector<int>>& grid, int x, int y){
grid[x][y] = 2;
for(int i = 0; i < 4; i++){
int nextx = x + dir[i][0];
int nexty = y + dir[i][1];
if(nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size())continue;
if(grid[nextx][nexty] == 0 || grid[nextx][nexty] == 2)continue;
dfs(grid, nextx, nexty);
}
return ;
}
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];
}
}
for(int i = 0; i < n; i++){
if(grid[i][0] == 1)dfs(grid, i, 0);
if(grid[i][m - 1] == 1)dfs(grid, i, m - 1);
}
for(int i = 0; i < m; i++){
if(grid[0][i] == 1)dfs(grid, 0, i);
if(grid[n - 1][i] == 1)dfs(grid, n - 1, i);
}
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(grid[i][j] == 1)grid[i][j] = 0;
if(grid[i][j] == 2)grid[i][j] = 1;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << grid[i][j] << " ";
}
cout << endl;
}
}