nyoj - 1154. 找食物(簡單BFS)
題目描述
很多關於末日的故事都很殘酷,但這部《少女終末旅行》卻不一樣。沒有戰爭,沒有為了食物的爭鬥,沒有人在乎之前發生了什麼,未來會怎麼樣,人類在一片溫暖中緩慢的等待死亡。距離極盡繁榮與榮華的人類文明迎來末日,已經經過了漫長的歲月。人類幾乎死絕,就連生物都消失的迎來末日的世界。複雜建造的都市化作宛如迷宮的廢墟,無從整備的機械也漸漸停止了動作。是何時結束的呢,是從何時開始結束的呢,就連這種想法也不復存在的終末世界中,有兩位少女漫無目的地持續著旅行。千戶與尤莉,今天也乘著愛車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;
}
相關文章
- 找朋友(bfs常錯!!)
- python簡單例題在哪找Python單例
- DFS與BFS——理解簡單搜尋(中文虛擬碼+例題)
- Pots(POJ - 3414)【BFS 尋找最短路+路徑輸出】
- flutter-簡單實現找妹子自定義viewFlutterView
- 仿鏈家地圖找房的簡單實現地圖
- 回顧二分與bfs(或者說是遞推)和簡單模擬
- 食物
- bfs
- 食物鏈
- 尋找圖的強連通分量:tarjan演算法簡單理解演算法
- NYOJ 1409 快速計算【矩陣連乘】矩陣
- BFS(模板)
- HDU 母函式簡單題 - 找單詞/Ignatius and the Princess III/Square Coins/Holding Bin-Laden Captive!函式APT
- NYOJ 1427-小石子游戲【石子合併】
- 影像匹配(大圖中找小圖)最簡單方法:aircv之find_templateAI
- 01BFS
- Count BFS Graph
- poj 3278 BFS
- 食物鏈題解
- 新工廠是如何找訂單的
- DAG bfs + dfs 126,
- 【BFS】poj 3414 Pots
- 食物鏈(並查集)並查集
- 食物大放送 aqx
- 簡單選擇排序就是簡單~~~排序
- BFS入門筆記筆記
- BFS和Dijkstra結合
- 【BFS】腐爛的橘子
- BFS/acm習題集ACM
- POJ3414 Pots【BFS】
- UVA11624 Fire!【BFS】
- BFS演算法原理演算法
- 單詞接龍---快速建圖----雙向BFS(廣度優先遍歷)
- JavaScript 簡單/不簡單 (小Tips分享)JavaScript
- AQS簡簡單單過一遍AQS
- 簡簡單單的Vue2(簡單語法,生命週期,元件)Vue元件
- 簡單的單例模式其實也不簡單單例模式