题目
时间限制:1秒
空间限制:65536K
给定一个m行n列的二维地图, 初始化每个单元都是水.
操作addLand 把单元格(row,col)变成陆地.
岛屿定义为一系列相连的被水单元包围的陆地单元, 横向或纵向相邻的陆地称为相连(斜对角不算).
在一系列addLand的操作过程中, 给出每次addLand操作后岛屿的个数.
二维地图的每条边界外侧假定都是水.
输入描述:
多组测试数据,请参考例题处理 每组数据k+3行, k表示addLand操作次数 第一行:表示行数m 第二行:表示列数n 第三行:表示addLand操作次数k 第4~k+3行:row col 表示addLand的坐标。注意超过边界的坐标是无效的。
输出描述:
一行,k个整数, 表示每次addLand操作后岛屿的个数, 用空格隔开,结尾无空格
输入例子1:
3 3 4 0 0 0 1 1 2 2 1
输出例子1:
1 1 2 3
分析:
本题解题思路核心在于:每把一个点变为陆地,那么之后的陆地数量将是原来陆地的数量减去该点所联通的陆地数量加1;即假设maxnum为当前的陆地数量,现把点(i,j)变为陆地,nums 为点(i,j) 所联通的陆地,那么(i,j)变为陆地之后 总的陆地数量即为: max(maxnum-nums+1,1),因为至少有1块陆地。
AC Code
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
int m,n,k;
cin>>m>>n>>k;
vector<vector<int> > data(m,vector<int>(n));
vector<int> ans;
int row, col, maxnum=0;
int zeros=0;
for(int i=0;i<k;i++){
zeros=0;
cin>>row>>col;
if(row<0 || col<0 || row>=m || col>=n || data[row][col]==1){
ans.push_back(maxnum);
continue;
}
data[row][col]=1;
for(int j=col-1;j<n && j<=col+1;j+=2){
if(j>=0 && data[row][j]==1){
zeros++;
}
}
for(int j=row-1;j<m && j<=row+1;j+=2){
if(j>=0 && data[j][col]==1){
zeros++;
}
}
maxnum = max(maxnum+1-zeros,1);
ans.push_back(maxnum);
}
if(ans.size()>0){
cout<<ans[0];
}
for(int i=1;i<ans.size();++i){
cout<<" "<<ans[i];
}
cout<<endl;
return 0;
}