nyoj - 1154. 找食物(簡單BFS)

大白QQly成長日記發表於2018-08-30

題目描述

很多關於末日的故事都很殘酷,但這部《少女終末旅行》卻不一樣。沒有戰爭,沒有為了食物的爭鬥,沒有人在乎之前發生了什麼,未來會怎麼樣,人類在一片溫暖中緩慢的等待死亡。距離極盡繁榮與榮華的人類文明迎來末日,已經經過了漫長的歲月。人類幾乎死絕,就連生物都消失的迎來末日的世界。複雜建造的都市化作宛如迷宮的廢墟,無從整備的機械也漸漸停止了動作。是何時結束的呢,是從何時開始結束的呢,就連這種想法也不復存在的終末世界中,有兩位少女漫無目的地持續著旅行。千戶與尤莉,今天也乘著愛車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次的題,從出發點到鑰匙,再從鑰匙到箱子.....(是我理解有問題還是出題人改的太尬)。先找鑰匙,在從鑰匙出發找箱子。這麼簡單的題.....這個提示誤人啊。

程式碼如下:

#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;
}

 

相關文章