明依 @ 2019-03-13 16:01:49
21分,实在改不动了...
#include<bits/stdc++.h>
using namespace std;
int t[50010],x[50010],y[50010],m,d[5]= {1,0,-1,0},e[5]= {0,1,0,-1},ans=99999999,z[510][510];
bool p[510][510]= {0};
void first() {
for(int i=1; i<=m; i++) {
for(int j=0; j<5; j++) {
int xx=x[i]+e[j],yy=y[i]+d[j];
if(z[xx][yy]>t[i]) z[xx][yy]=t[i];
}
}
}//预处理所有的点,看看那些能走哪些不能走
struct egg {
int x,y,s;
} qwq;
int main() {
cin>>m;
for(int i=1; i<=m; i++) cin>>x[i]>>y[i]>>t[i];
memset(z,0x3f,sizeof(z));//0x3f--1061109567
first();
if(z[0][0]==1061109567){
cout<<0;
return 0;
}//啧啧啧运气真好
queue<egg>q;
qwq.x=0;
qwq.y=0;
qwq.s=1;
q.push(qwq);
p[0][0]=1;
while(!q.empty()) {
egg c=q.front();
q.pop();
for(int i=0; i<4; i++) {
int xx=c.x+e[i],yy=c.y+d[i];
if(z[xx][yy]){
if(c.s==z[xx][yy]) continue;
}
if(xx>=0&&yy>=0&&xx<=310&&yy<=310&&z[xx][yy]==1061109567) {
if(ans>c.s) ans=c.s;
break;
}
if(xx>=0&&yy>=0&&xx<=310&&yy<=310&&!p[xx][yy]) {
p[xx][yy]=1;
qwq.x=xx;
qwq.y=yy;
qwq.s=c.s+1;
q.push(qwq);
}
}
}
if(ans!=99999999) cout<<ans;
else cout<<-1;
return 0;
}
by 明依 @ 2019-03-13 16:07:26
急啊!!在线等
by 稚名真白 @ 2019-03-13 16:47:37
明显要是一个流星在t==1061109567的时候掉下来 你可以走他要落下来的位置 意思是只要你在流星落下之前都可以走到那个位置 所以人走和流星落要一起bfs
by 明依 @ 2019-03-13 16:56:34
找到原因了。在if(z[xx][yy])中应该是c.s>=z[xx][yy]而不是等于
by 稚名真白 @ 2019-03-13 17:05:27
%%%