Lianyike1314 @ 2024-07-29 20:21:51
#include<bits/stdc++.h>
using namespace std;
const int N = 310;
int m;
int death[N][N],ans[N][N];//death是记录要被砸中的时间,ans是到这个位置的花的时间
int op[N][N];//op:是记录是否走过
int dx[5] = {0 , 0, -1, 1}, dy[5] = {1, -1, 0, 0};
queue<pair<int,int>> q;
int main()
{
//读取数据并且得到所有可能被砸对应的时间图
cin >> m;
memset(death, -1,sizeof death);
for(int i = 0; i < m; i++)
{
int x,y,t;
cin>>x>>y>>t;
if(t<death[x][y]||death[x][y]==-1) //这颗流星到达的时间必须小于前面流星或焦土到达的时间,或者还暂时没有流星及焦土
death[x][y]=t;
for(int i=0; i<4; i++)
{
int nx=x+dx[i],ny=y+dy[i];
if(nx>=0&&ny>=0&&(death[nx][ny]==-1||t<death[nx][ny]))
death[nx][ny]=t; //枚举焦土
}
}
op[0][0] = 1;
if(death[0][0] == -1)
{
printf("0");
return 0;
}
//开始做节点
q.push({0,0});
while(!q.empty())
{
auto t = q.front();
q.pop();
for(int i = 0; i < 4; i++)
{
int x = t.first + dx[i], y = t.second + dy[i];
if(x >= 0 && y>= 0 && !op[x][y] && (ans[t.first][t.second] + 1 < death[x][y] || death[x][y] == -1))//满足条件且到该点时没有死亡
{
ans[x][y] = ans[t.first][t.second] + 1;
if(death[x][y] == -1)
{
printf("%d",ans[x][y]);
return 0;
}
q.push({x,y});
op[x][y] == 1;
}
}
}
printf("-1");
return 0;
}
by Lianyike1314 @ 2024-07-29 20:22:59
主要是我感觉我和有个题解写得蛮像的,不知道为什么就是过不了