题意:有一个面积为h*w的小岛,四面环海,每一部分的海拔为aij,海平面每年上升1.在这里,垂直或水平临海的地段或沉入海中的地段,其标高不大于海平面,就会沉入海中。当一个断面新沉入海中时,垂直或水平相邻的标高不大于海平面的断面也会同时沉入海中,新沉入海中的断面重复这一过程。对于1,2,3。。。Y,求i年后该岛仍高于海平面的面积。
分析:可以先将四周存入队列里,并标记为走过,因为使用函数greater<int>来生成小根堆,然后每次遍历最小海拔,推入最小海拔四周没有走过的的地方,然后将最小海拔推出。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int a[N][N],visited[N][N];
int main(){
int n,m,k;cin>>n>>m>>k;int c=n*m;
priority_queue<vector<int>,vector<vector<int>>,greater<vector<int>>>q;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
if(i==1||j==1||i==n||j==m){
q.push({a[i][j],i,j});
visited[i][j]=true;
}
}
}
for(int i=1;i<=k;i++){
while(!q.empty()&&q.top()[0]<=i){
c--;
int x=q.top()[1],y=q.top()[2];
q.pop();
for(int j=0;j<4;j++){
int xx=x+dx[j],yy=y+dy[j];
if(xx<1||yy<1||xx>n||yy>m||visited[xx][yy])continue;
visited[xx][yy]=true;
q.push({a[xx][yy],xx,yy});
}
}
cout<<c<<endl;
}
}