nyoj - 1154. 找食物(简单BFS)

版权声明:转载请标明出处哦 https://blog.csdn.net/PleasantlY1/article/details/82220356

题目描述

很多关于末日的故事都很残酷,但这部《少女终末旅行》却不一样。没有战争,没有为了食物的争斗,没有人在乎之前发生了什么,未来会怎么样,人类在一片温暖中缓慢的等待死亡。距离极尽繁荣与荣华的人类文明迎来末日,已经经过了漫长的岁月。人类几乎死绝,就连生物都消失的迎来末日的世界。复杂建造的都市化作宛如迷宫的废墟,无从整备的机械也渐渐停止了动作。是何时结束的呢,是从何时开始结束的呢,就连这种想法也不复存在的终末世界中,有两位少女漫无目的地持续着旅行。千户与尤莉,今天也乘着爱车Kettenkrad,在废墟当中彷徨。 在终末世界中温暖地求生的反乌托邦幻想剧,就此开幕

为了在这个荒无人烟的世界上生存下去千户和尤梨不得不解决眼前的困难那就是找食物,在这个(n*m)迷宫里两人的坐标在(x,y),两人想要得到箱子里的食物就必须要找到钥匙,现在她们两人并不知道钥匙和箱子的位置她们两人很饿所以请你给他们规划一下路线让他们两人能够尽快吃到东西。输出最少要走的步数

输入

第一行两个数 n ,m 表示 迷宫的大小(n,m<1000)

第2行到 第 n+1 行 每行m个字符,"*"代表墙壁不可走 “.”代表可走 ‘S’ 钥匙 'T'  箱子的位置

n+2行 两个数 x,y 代表两人的起始位置  (只能走上下左右四个方向)

输出

能找到食物输出最少要走的步数  不能找到输出“-1”;

样例输入

3 3
S.*
..T
***
1 2

样例输出

4

提示

S T 唯一且保证存在 S T保证不再一个格子里

没有找到钥匙之前 箱子的位置是不可走的

初始位置不可能在钥匙和箱子所在的格子

思路:本以为2个人分头寻找求最短步数且箱子能移动,那应该是同为最少步数的情况下,先找到的向未找到的靠近,那应该就是3次BFS,分别求到钥匙到箱子的最优步数a.b,再求从钥匙到箱子原位置的最少步数c,那结果就是max(a,b)+(c-min(a,b))/2,结果,,,,,,就只是一个BFS搜2次的题,从出发点到钥匙,再从钥匙到箱子.....(是我理解有问题还是出题人改的太尬)。先找钥匙,在从钥匙出发找箱子。这么简单的题.....这个提示误人啊。

代码如下:

扫描二维码关注公众号,回复: 3353191 查看本文章
#include<set>
#include<map>
#include<list>
#include<deque>
#include<cmath>
#include<queue>
#include<stack>
#include<string>
#include<vector>
#include<stdio.h>
#include<sstream>
#include<stdlib.h>
#include<string.h>
//#include<ext/rope>
#include<iostream>
#include<algorithm>
#define pi acos(-1.0)
#define INF 0x3f3f3f3f
#define per(i,a,b) for(int i=a;i<=b;++i)
#define rep(i,a,b) for(int i=a;i>=b;--i)
#define max(a,b)  a>b?a:b
#define min(a,b)  a<b?a:b
#define LL long long 
#define swap(a,b) {int t=a;a=b;b=t} 
using namespace std;
//using namespace __gnu_cxx;
char p[1010][1010];
int f[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int vis[1010][1010];
int n,m,ans,x,y;
struct node{
    int x,y,bs;
}z;
void BFS(int k)
{
    memset(vis,0,sizeof(vis));
    queue<node>q;
    if(k==1) z.x=x,z.y=y,z.bs=ans;
    q.push(z);
    vis[z.x][z.y]=1;
    while(!q.empty())
    {
        node t=q.front();
		q.pop();
        if((k==0&&p[t.x][t.y]=='S')||(k==1&&p[t.x][t.y]=='T'))
        {
            x=t.x;
            y=t.y;
            ans=t.bs;
            //cout<<t.bs<<"&";
            return ;
        }
        per(i,0,3)
        {
        	node p1;
        	p1.x=t.x+f[i][0];
        	p1.y=t.y+f[i][1];
            if(p1.x>0&&p1.x<=n&&p1.y>0&&p1.y<=m&&vis[p1.x][p1.y]==0&&p[p1.x][p1.y]!='*') 
            {
            	p1.bs=t.bs+1;
				vis[p1.x][p1.y]=1;
                q.push(p1);
            }    
        }
    }
}
int main()
{
    cin>>n>>m;
    per(i,1,n)
    {
    	per(j,1,m) cin>>p[i][j];
	}
    cin>>x>>y;
    z.x=x;z.y=y;
    z.bs=0;
    BFS(0);//钥匙
    BFS(1);//箱子
    if(p[x][y]!='T') printf("-1");
    else  printf("%d",ans);
    return 0;
}

 

猜你喜欢

转载自blog.csdn.net/PleasantlY1/article/details/82220356