• 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;
    }
    
     
  • 相关阅读:
    基于BIM与点云数据的塔吊仿真系统记录
    ModuleNotFoundError: No module named 'imgaug'
    ifc地形数据测试
    Command 'protoc' not found, but can be installed with
    运行错误
    java遍历目录下的目录和文件
    给输出框编号
    pytorch yolov5两块gpu训练日志
    matlab atan2
    执行的命令
  • 原文地址:https://www.cnblogs.com/cssystem/p/3170632.html
Copyright © 2020-2023  润新知