背景 Background
公园里有个人在练开奔驰 - -!,但是总是撞在bench上 (众人曰:狼来了,快跑啊!)描述 Description
公园里的bench与奔驰都是无敌的,不会被撞坏。由于开奔驰的人比较"有特点",总是向上下左右四个方向开,而且只会在撞到椅子之后改变方向(起步时除外) - -!
现在他给你一张地图,上面标明 他的位置 、 公园里的bench的位置 和 他想到达的位置,可能会有冲出地图的可能
请你告诉他最少撞多少下才能到达目的地,并答应事成之后会给你一辆奔驰..............................................的照片
输入格式 InputFormat
第一行,两个数,分别表示地图的行和列,都不大于50以下是地图,"."表示地面,"S"表示起点,"E"表示终点,"B"表示bench(什么意思呢?)
保证只有一个终点和一个起点,并不会出现其他字符
输出格式 OutputFormat
第一行,表示他能不能到达目的地。如果能,就输出"Yes"。否则,输出"No"如果能到达目的地,就在第二行输出最少的撞击次数
样例输入 SampleInput [复制数据]
测试数据1:
5 5
BBBBB
B...B
BSE.B
B...B
BBBBB
测试数据2:
3 3
S..
...
..E
样例输出 SampleOutput [复制数据]
测试数据1:
Yes
0
测试数据2:
No
数据范围和注释 Hint
测试数据1:点火后直接向右走测试数据2:四个方向都会冲出地图
来源 Source
某个经典的游戏......思路:BFS即可
#include <iostream> #include <cmath> #include <cstdio> #include <algorithm> #include <cstring> #include <string> #include <cstdlib> #include <queue> using namespace std; const int maxn=60; struct qq { int x,y,d; } ya,pu; queue<qq> q; int sx,sy,l,step,n,m,cnt=0; char s[maxn][maxn]; void close() { exit(0); } bool judge(int x,int y,int xx,int yy) { cnt++; if (cnt>1E7) { printf("No "); close(); } if (s[x][y]=='E') { printf("Yes %d ",step); close(); } if (s[x][y]=='B') { for (int j=1;j<=4;j++) { if (j==ya.d) continue; pu.x=xx; pu.y=yy; pu.d=j; q.push(pu); } return true; } return false; } void simulate() { ya=q.front(); q.pop(); if (ya.d==4) { for (int i=ya.y;i>=1;i--) { if (judge(ya.x,i,ya.x,i+1)) return; } } if (ya.d==2) { for (int i=ya.y;i<=m;i++) if (judge(ya.x,i,ya.x,i-1)) return; } if (ya.d==3) { for (int i=ya.x;i<=n;i++) if (judge(i,ya.y,i-1,ya.y)) return; } if (ya.d==1) { for (int i=ya.x;i>=1;i--) if (judge(i,ya.y,i+1,ya.y)) return; } } void work() { step=0; while (!q.empty()) q.pop(); for (int i=1;i<=4;i++) { ya.x=sx;ya.y=sy;ya.d=i; q.push(ya); } while (!q.empty() && step<=2500) //delete { l=q.size(); for (int i=1;i<=l;i++) { simulate(); } step++; } } void init() { scanf("%d %d",&n,&m); for (int i=1;i<=n;i++) { scanf("%s",s[i]); for (int j=m;j>=1;j--) { s[i][j]=s[i][j-1]; } s[i][0]=' '; } for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) { if (s[i][j]=='S') { sx=i;sy=j; } } work(); printf("No "); } int main () { init(); close(); return 0; }