hrbust1444 逃脱 【BFS】
Description
这是mengxiang000和Tabris来到幼儿园的第四天,幼儿园老师在值班的时候突然发现幼儿园某处发生火灾,而且火势蔓延极快,老师在第一时间就发出了警报,位于幼儿园某处的mengxiang000和Tabris听到了火灾警报声的同时拔腿就跑,不知道两人是否能够逃脱险境?
幼儿园可以看成是一个N*M的图,在图中一共包含以下几种元素:
“.”:表示这是一块空地,是可以随意穿梭的。
“#”:表示这是一块墙,是不可以走到这上边来的,但是可以被火烧毁。
“S”:表示mengxiang000和Tabris所在位子。
“E”:表示幼儿园的出口。
“*”表示火灾发源地(保证输入只有一个火灾发源地)。
已知每秒有火的地方都会向周围八个格子(上下左右、左上、右上、左下、右下)蔓延火势.mengxiang000和Tabris每秒都可以选择周围四个格子(上下左右)进行移动。(假设两人这一秒行动完之后,火势才蔓延开)
根据已知条件,判断两人能否成功逃脱险境,如果可以,输出最短逃离时间,否则输出T_T。
Input
第一行输入一个整数t,表示一共的测试数据组数。
第二行输入两个整数n,m,表示幼儿园的大小。
接下来n行,每行m个字符,表示此格子是什么元素。
t<=200
3<=n<=30
3<=M<=30
保证图中有一个起点,一个出口,一个火灾源处.
Output
每组数据输出一行,如果两人能够成功到达出口,那么输出最短逃离时间,否则输出T_T
Sample Input
35 5*...........S#....E......5 5...#*..#S#...##....E.....5 5.....S......*#....E......
Sample Output
2T_TT_T
HINT
为了防止孩子们嬉戏中受伤,墙体是橡胶制作的,可以燃烧的哦。
Source
思路:
一开始想的是。。。走的时候考虑火已经蔓延。。。我也不知道为什么这么考虑,然后大哥说可能他第一步就直接到达了= =、是啊,所以不能这么考虑啊,还是人先走,然后火后走,BFS就是那么按部就班,感觉真是蠢哭,只要能走到就进队,然后在出队的时候判断一下是不是已经走到了。
然后wa到怀疑人生啊!!!卧槽!!!卧槽!!!因为我天真的判断了一下出队的火的蔓延,然后入队那边火的蔓延没有判断。。。。
这题BFS是:
1.搜索一定是按部就班的!
2.搜索你踏马的判断条件,各种限制都不能省啊
哎。。。贴一发代码;
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int N=50; int huo[N][N]; char ma[N][N]; int n,m; int sx,sy; int ex,ey; struct asd{ int x,y; int step; }; int dx[4]={1,-1,0,0}; int dy[4]={0,0,-1,1}; void BFS() { bool vis[N][N]; queue<asd>q; memset(vis,0,sizeof(vis)); asd now,next; now.x=sx; now.y=sy; now.step=0; vis[sx][sy]=1; q.push(now); while(!q.empty()) { now=q.front(); q.pop(); if(now.x==ex&&now.y==ey) //出队的时候先考虑是不是到了,然后考虑烧到了没 { printf("%d\n",now.step); return; } if(huo[now.x][now.y]<=now.step) continue; for(int i=0;i<4;++i) { int x=now.x+dx[i]; int y=now.y+dy[i]; if(x<0||y<0||x>=n||y>=m||vis[x][y]||ma[x][y]=='#'||huo[x][y]<now.step+1)//就是这里!!! continue; vis[x][y]=1; next.step=now.step+1; next.x=x; next.y=y; q.push(next); } } puts("T_T"); } void DEBUG() { for(int i=0;i<n;i++) { for(int j=0;j<m;j++) printf("%3d",huo[i][j]); puts(""); } } void init_huo() { memset(huo,-1,sizeof(huo)); int flag=0; int x,y; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(ma[i][j]=='*') { flag=1; x=i; y=j; huo[i][j]=0; break; } } if(flag) break; } for(int i=0;i<n;++i) { for(int j=0;j<m;j++) { if(huo[i][j]==-1) huo[i][j]=max(abs(i-x),abs(j-y)); } } //DEBUG(); } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%s",ma[i]); int flag=0; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(ma[i][j]=='S') { sx=i; sy=j; flag+=1; } if(ma[i][j]=='E') { ex=i; ey=j; flag+=1; } if(flag==2) break; } if(flag==2) break; } init_huo(); BFS(); } return 0; } /* 5 5 *.... .S... ...#. ..... ....E 5 5 *..E. ..... ..S#. ..... ..... 5 5 *.... ..... ..S#. ..#E. ..... 5 5 #.... ..... ..S*. ..E.. ..... 5 5 #.... ..S.. E..*. ..... ..... */