FZU escape(两个bfs)

来源:互联网 发布:单片机将来工作 编辑:程序博客网 时间:2024/06/04 17:49

题目链接:点击打开

终于把它给过了,wa了好多好多次,一个页面基本上都是我提交的wa大哭就因为没有判断准确符号问题,这道题是

按着网上的答案来写的,思路:这道题不是简单的bfs问题,因为每个格子时刻在变化着,它可以走也可以不走,所以

呢,我们需要先把每个格子可以走的时间算出来,算出他们被岩浆覆盖时的时间,然后就可以判断能不能走该格子了,

先用一个bfs来与处理一下岩浆蔓延到每个格子的时间,再用一个bfs来模拟游戏的路线,注意:题上已经说明了,如果

走到了E就算成功逃出,所以如果岩浆和小孩同时到达了E就算成功逃出,其他的格子不能他们同时出现(我就是在这个

地方wa的。。。。但是我不明白为什么用GNU c++交会出现编译错误。。)贴代码:

#include <cstdio>  #include <cstring>  #include<queue>using namespace std;typedef struct{int i,j,step;}node;int  time[1005][1005];//用来表示岩浆到达格子所用的最少时间int visit[1005][1005];//标记是否已经访问过该点char a[1005][1005];int dx[4]={-1,0,0,1};int dy[4]={0,-1,1,0};int si,sj,ei,ej;int n,m;int const INF = 0x7fffffff; int ok(int x,int y){if(x>=1&&y>=1&&x<=n&&y<=m)return 1;return 0;}void bfs1()//预处理每个格子什么时候可以走{int i,j;queue <node> q;//建立一个队列,将岩浆发源地入队for(i=1;i<=n;i++){for(j=1;j<=m;j++){if(a[i][j]=='!'){node p;time[i][j]=0;p.i=i;p.j=j;p.step=0;q.push(p);}}}while(!q.empty()){node t,w;w=q.front();q.pop();for(i=0;i<4;i++){ t.i=w.i+dx[i]; t.j=w.j+dy[i]; t.step=w.step+1;if(ok(t.i,t.j)&&time[t.i][t.j]>t.step){  time[t.i][t.j]=t.step;  q.push(t);}}}return;}int bfs2(int x,int y){queue <node> qq ;node w;w.i=x;w.j=y;w.step=0;qq.push(w);visit[w.i][w.j]=1;while(!qq.empty()){node t,p;t=qq.front();qq.pop();if(t.i==ei&&t.j==ej&&p.step<=time[ei][ej]){printf("Yes\n"); return 0;}for(int i=0;i<4;i++){    p.i=t.i+dx[i];    p.j=t.j+dy[i];    p.step=t.step+1;    if(p.i==ei&&p.j==ej&&p.step<=time[ei][ej]){printf("Yes\n"); return 0;}    if(ok(p.i,p.j)&&!visit[p.i][p.j]&&p.step<time[p.i][p.j])    {    visit[p.i][p.j]=1;    qq.push(p);    }}}printf("No\n");return 0;}int main(){int t,i,j;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);if(n==0||m==0) {printf("No\n");continue;}memset(visit,0,sizeof(visit));for(i=1;i<=n;i++){scanf("%s",a[i]+1);for(j=1;j<=m;j++){time[i][j]=INF;//将每个格子的初值都设为最大if(a[i][j]=='S'){si=i;sj=j;}if(a[i][j]=='E'){ei=i;ej=j;}if(a[i][j]=='#')time[i][j]=0;//墙的时间为0,证明是不可以走的,也可以设为已访问过}}bfs1();bfs2(si,sj);}return 0;} 

0 0