这是一道bfs题,寻找一个最近的不会被流星砸到的点。
其实主要处理好判断点的合理性问题就好了,题目中一句话比较关键,一旦一个点被流星破坏,之后这个点就不能再站人了。因此我们只要预处理出每个被破坏的点的最早时间就可以啦,然后后面的就很简单了。
代码君
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
#define MP(x,y) make_pair(x,y)
#define X first
#define Y second
int mp[310][310];
bool visited[301][301];
int dirx[5]={0,0,1,-1,0};
int diry[5]={1,-1,0,0,0};
void add(int x,int y,int t){
for(int i=0;i<=4;i++){
int xx=x+dirx[i],yy=y+diry[i];
if(xx>=0&&yy>=0){
if(mp[xx][yy]==-1)mp[xx][yy]=t;
else mp[xx][yy]=min(mp[xx][yy],t);
}
}
}
int main(){
int n,x,y,t;
while(cin>>n){
memset(visited,false,sizeof(visited));
memset(mp,-1,sizeof(mp));
for(int i=0;i<n;i++){
scanf("%d%d%d",&x,&y,&t);
add(x,y,t);
}
queue<pair<pair<int,int>,int> >que;
que.push(MP(MP(0,0),0));
int pos=301*301+10;
while(!que.empty()){
int i=que.front().X.X;
int j=que.front().X.Y;
int t=que.front().Y;
que.pop();
if(visited[i][j])continue;
visited[i][j]=true;
if(mp[i][j]!=-1&&t>=mp[i][j])continue;
if(mp[i][j]==-1){
pos=t;
break;
}
int ii,jj;
for(int k=0;k<4;k++){
ii=i+dirx[k];
jj=j+diry[k];
if(ii>=0&&jj>=0){
que.push(MP(MP(ii,jj),t+1));
}
}
}
if(pos>=301*301)cout<<"-1"<<endl;
else cout<<pos<<endl;
}
return 0;
}