背景 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\n");
close();
}
if (s[x][y]=='E')
{
printf("Yes\n%d\n",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]='\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\n");
}
int main ()
{
init();
close();
return 0;
}