我的第一道BFS。。。。花了不少时间恶补队列。。。。。。不要被这
到题目吓到就是加一个danger数组标记被陨石摧毁的路就OK了。。。。
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
#define MAXN 500
#define MAXLN 500000
typedef pair<int,int> P;
int x[MAXLN],y[MAXLN],t[MAXLN];
int move[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int danger[MAXN][MAXN],danger1[MAXN][MAXN],n,ok[MAXN][MAXN];
int bfs(){
int h,a,b;
queue<P> que;
que.push(P(0,0));
while(que.size()){
P p=que.front();que.pop();
a=p.first,b=p.second;
if(danger[a][b]!=1){
break;
}
for(int z=0;z<n;z++){
if(ok[a][b]+1==t[z]){
ok[x[z]][y[z]]=-1;
danger1[x[z]][y[z]]=1;
for(int r=0;r<4;r++){
if(x[z]+move[r][0]>=0&&y[z]+move[r][1]>=0)
danger1[x[z]+move[r][0]][y[z]+move[r][1]]=1;
}
}
}
for(h=0;h<4;h++){
int na=a+move[h][0],nb=b+move[h][1];
if(na>=0&&nb>=0&&ok[na][nb]==-1&&danger1[na][nb]!=1){
que.push(P(na,nb));
ok[na][nb]=ok[a][b]+1;
}
}
}
if(a==0&&b==0&&danger[a][b]==1){
return -1;
}
return ok[a][b];
}
int main(){
int i,j,ans;
memset(ok, -1, sizeof(ok));
memset(danger, 0, sizeof(danger));
memset(danger1, 0, sizeof(danger1));
while(scanf("%d\n",&n)!=EOF){
for(i=0;i<n;i++){
scanf("%d %d %d",&x[i],&y[i],&t[i]);
if(t[i]==0){
danger1[x[i]][y[i]]=1;
for(j=0;j<4;j++){
if(x[i]+move[j][0]>=0&&y[i]+move[j][1]>=0)
danger1[x[i]+move[j][0]][y[i]+move[j][1]]=1;
}
}
danger[x[i]][y[i]]=1;
for(j=0;j<4;j++){
if(x[i]+move[j][0]>=0&&y[i]+move[j][1]>=0)
danger[x[i]+move[j][0]][y[i]+move[j][1]]=1;
}
}
ok[0][0]=0;
ans=bfs();
printf("%d\n",ans);
}
return 0;
}
到题目吓到就是加一个danger数组标记被陨石摧毁的路就OK了。。。。