我的思路是用bfs模拟,以时间t为维度进行遍历,给每一个地块赋值最早到达的时间。等t到了陨石砸下的时候就将毁坏的地块强行赋值-1。
最后一个点wa,数组开了1e3+5,而且取消了对边界的判断,应该不是数组开小的原因。 求大佬指点!
#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <string>
#include <algorithm>
#include <map>
#include <cstring>
using namespace std;
#define int long long
#define input(f) for(int i=1;i<=n;cin>>f[i++])
#define print(f) for(int i=0;i<n;cout<<f[i++]<<(i==n?'\n':' '))
const int INF=0x3f3f3f3f;
const int MAXN=1e3+5;
int f[MAXN][MAXN];
int go[][2]={{0,1},{1,0},{-1,0},{0,-1}};
struct cyx
{
int x,y,t;
}lst[50000+5];
queue<pair<int,int>>q;
bool check(int x,int y)
{
if (0<=x && 0<=y && f[x][y]==0 && !(x==0 && y==0)) return true;
return false;
}
void za(int x,int y)
{
f[x][y]=-1;
for (int i=0;i<4;i++)
if ( (x+go[i][0])>=0 && (y+go[i][1])>=0)
f[x+go[i][0]][y+go[i][1]]=-1;
}
bool cmp(cyx a,cyx b){return a.t<b.t;}
signed main()
{
int T,k=0,cnt=0,cnt1=1,cnt2=0;
cin>>T;
for (int i=0;i<T;i++)
cin>>lst[i].x>>lst[i].y>>lst[i].t;
sort(lst,lst+T,cmp);
q.push(make_pair(0,0));
f[0][0]=0;
while (q.size()!=0)
{
while (lst[cnt].t==k && cnt<T)
{
za(lst[cnt].x,lst[cnt].y);
cnt++;
}
int x=q.front().first,y=q.front().second;
q.pop();
cnt1--;
for(int i=0;i<4;i++)
{
if (check(x+go[i][0],y+go[i][1]) && f[x][y]!=-1)
{
f[x+go[i][0]][y+go[i][1]]=k+1;
q.push(make_pair(x+go[i][0],y+go[i][1]));
cnt2++;
}
}
if (cnt1==0)
{
cnt1=cnt2;
cnt2=0;
k++;
}
}
while (lst[cnt].t>=k && cnt<T)
{
za(lst[cnt].x,lst[cnt].y);
cnt++;
}
int ans=INF;
for (int i=0;i<300;i++)
{
for (int j=0;j<300;j++)
{
if (f[i][j]==0 && !(i==0 && j==0)) continue;
ans=(f[i][j]==-1?ans:min(ans,f[i][j]));
}
}
cout<<((ans==INF||ans==0&&f[0][0]==-1)?-1:ans)<<endl;
}