这份代码样例都过了,但是只有40分,大佬们看看有啥bug
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
int n, m, q, r, k;
int a, b, c, d, t, x, y;
int mp[3005][3005];//0陆地,1湖泊,2湖泊周围(必定无限存活)
int f[3005][3005];//是否无限存活
int dix[]= {1, -1, 0, 0};
int diy[]= {0, 0, 1, -1};
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin>>n>>m>>q>>r>>k;
while(q--)
{
cin>>a>>b>>c>>d;
for(int i=a; i<=c; i++)
for(int j=b; j<=d; j++)
mp[i][j]=1;
}
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
if(mp[i][j]==0)
{
int cnt=0;
for(int k=0; k<4; k++)
{
int tx=i+dix[k];
int ty=j+diy[k];
if(tx<1||tx>n||ty<1||ty>m)continue;
if(mp[tx][ty]==1)cnt++;
}
if(cnt)mp[i][j]=2;//是湖泊周围点
}
}
}
while(r--)
{
cin>>t>>x>>y;
if(f[x][y]==0x3f3f3f3f)continue;//已经无限存活,可跳过
queue<pair<int, int>>q;
f[x][y]=t;
q.push({x, y});
while(!q.empty())//生长周围点,仅湖泊周围的点可生长
{
pair<int, int> now=q.front();
q.pop();
for(int i=0; i<4; i++)
{
int tx=now.first+dix[i];
int ty=now.second+diy[i];
if(tx<1||tx>n||ty<1||ty>m)continue;
if(mp[tx][ty]!=2)continue;
if(f[tx][ty]==0x3f3f3f3f)continue;
f[tx][ty]=0x3f3f3f3f;
q.push({tx, ty});
}
}
bool flag=false;
for(int i=0; i<4; i++)//周围是否存在可无限存在点
{
int tx=x+dix[i];
int ty=y+diy[i];
if(tx<1||tx>n||ty<1||ty>m)continue;
if(f[tx][ty]>0 && f[tx][ty]+k>=f[x][y])//种过时间间隔k以内的相邻点,这两个会无限生存
{
f[tx][ty]=0x3f3f3f3f;
flag=true;//可以存活
}
}
if(flag)f[x][y]=0x3f3f3f3f;
}
int ans=0;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
ans+=f[i][j]==0x3f3f3f3f;
// cout<<(f[i][j]==0x3f3f3f3f)<<" \n"[j==m];
}
}
cout<<ans;
return 0;
}