TYVJ P1234

背景 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;
}
 
原文地址:https://www.cnblogs.com/cssystem/p/3170632.html