飞跃原野(三维bfs)
Problem Description
终于,法里奥来到了最后的一站:泰拉希尔原野,穿过这里就可以回到基地了。然而,敌人依然紧追不舍。不过,泰拉希尔的地理条件对法里奥十分有利,众多的湖泊随处分布。敌人需要绕道而行,但法里奥还是决定找一条能尽快回到基地的路。
假设泰拉希尔原野是一个m*n的矩阵,它有两种地形,P表示平,L表示湖泊,法里奥只能停留在平地上。他目前的位置在左上角(1,1)处,而目的地为右下角的(m,n)。法里奥可以向前后左右4个方向移动或飞行,每移动1格需要1单位时间。而飞行的时间主要花费在变形上,飞行本身时间消耗很短,所以无论一次飞行多远的距离,都只需要1单位时间。飞行的途中不能变向,并且一次飞行最终必须要降落到平地上。当然,由于受到能量的限制,法里奥不能无限制飞行,他总共最多可以飞行的距离为D。在知道了以上的信息之后,请你帮助法里奥计算一下,他最快到达基地所需要的时间。
Input
Output
Sample Input
4 4 2
PLLP
PPLP
PPPP
PLLP
Sample Output
5
Hint
Source
在bfs的基础上多出一维用来标记表示剩余的飞行距离
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<map>
#include<cmath>
const int maxn=1e5+;
typedef long long ll;
using namespace std;
int n,m,d;
struct node
{
int x,y;
int step;
int left;
};
char Map[][];
int vis[][][];
int dir[][]={{,},{,-},{-,},{,}};
bool check(int x,int y)
{
if(x>=&&x<m&&y>=&&y<n)
{
return true;
}
else
{
return false;
}
}
int BFS(int x,int y )
{
node start ;
start.x=x;
start.y=y;
vis[x][y][d]=;
start.step=;
start.left=d;
queue<node>q;
q.push(start);
while(!q.empty())
{
node now;
now =q.front();
q.pop();
//cnt[now.x][now.y]=now.step;
if(now.x==m-&&now.y==n-)
{
return now.step;
}
for(int t=;t<;t++)
{
node next;
next.x=now.x+dir[t][];
next.y=now.y+dir[t][];
next.step=now.step+;
next.left=now.left;
if(check(next.x,next.y)&&vis[next.x][next.y][next.left]==&&Map[next.x][next.y]=='P')
{
vis[next.x][next.y][next.left]=;
q.push(next);
}
}
for(int t=;t<=d;t++)
{
node next;
next.x=now.x+;
next.y=now.y+t;
next.step=now.step+;
next.left=now.left-t;
if(check(next.x,next.y)&&vis[next.x][next.y][next.left]==&&Map[next.x][next.y]=='P'&&next.left>=)
{
vis[next.x][next.y][next.left]=;
q.push(next);
}
next.x=now.x+t;
next.y=now.y+;
next.step=now.step+;
next.left=now.left-t;
if(check(next.x,next.y)&&vis[next.x][next.y][next.left]==&&Map[next.x][next.y]=='P'&&next.left>=)
{
vis[next.x][next.y][next.left]=;
q.push(next);
}
next.x=now.x+;
next.y=now.y-t;
next.step=now.step+;
next.left=now.left-t;
if(check(next.x,next.y)&&vis[next.x][next.y][next.left]==&&Map[next.x][next.y]=='P'&&next.left>=)
{
vis[next.x][next.y][next.left]=;
q.push(next);
}
next.x=now.x-t;
next.y=now.y+;
next.step=now.step+;
next.left=now.left-t;
if(check(next.x,next.y)&&vis[next.x][next.y][next.left]==&&Map[next.x][next.y]=='P'&&next.left>=)
{
vis[next.x][next.y][next.left]=;
q.push(next);
}
}
}
return ;
}
int main()
{
cin>>m>>n>>d;
memset(vis,,sizeof(vis));
for(int t=;t<m;t++)
{
scanf("%s",Map[t]);
}
int ans=BFS(,);
if(!ans)
{
cout<<"impossible"<<endl;
return ;
}
cout<<ans<<endl;
return ;
}
飞跃原野(三维bfs)的更多相关文章
- AOJ.866 飞越原野 (三维BFS)
AOJ.866 飞越原野 (三维BFS) 题意分析 点我挑战题目 相比于普通的BFS,要多一维来记录当前剩余的体力.而且还要额外的一层循环来处理,飞过的路程. 代码总览 #include <io ...
- SDUT OJ 1124 飞越原野 (三维BFS练习)
飞跃原野 nid=24#time" title="C.C++.go.haskell.lua.pascal Time Limit5000ms Memory Limit 65536K ...
- SDUT 1124-飞跃荒野(三维BFS)
飞跃原野 Time Limit: 5000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描写叙述 勇敢的法里奥出色的完毕了任务之后.正在迅速地向自己的基地撤退.但因为 ...
- hdu 1240:Asteroids!(三维BFS搜索)
Asteroids! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路)
POJ 2251 题目大意: 给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径,移动方向可以是上,下,左,右,前,后,六个方向,每移动一次就耗费一分钟,要求输出最快的走出时间.不同L层 ...
- POJ 2049— Finding Nemo(三维BFS)10/200
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013497151/article/details/29562915 海底总动员.... 这个题開始 ...
- POJ.2251 Dungeon Master (三维BFS)
POJ.2251 Dungeon Master (三维BFS) 题意分析 你被困在一个3D地牢中且继续寻找最短路径逃生.地牢由立方体单位构成,立方体中不定会充满岩石.向上下前后左右移动一个单位需要一分 ...
- hdu 1885 Key Task (三维bfs)
题目 之前比赛的一个题, 当时是崔老师做的,今天我自己做了一下.... 还要注意用bfs的时候 有时候并不是最先到达的就是答案,比如HDU 3442 这道题是要求最小的消耗血量伤害,但是并不是最先到 ...
- HDU 1885 Key Task(三维BFS)
题目链接 题意 : 出口不止一个,一共有四种颜色不同的门由大写字母表示,而钥匙则是对应的小写字母,当你走到门前边的位置时,如果你已经走过相应的钥匙的位置这个门就可以走,只要获得一把钥匙就可以开所有同颜 ...
随机推荐
- 最后通牒!8月1日开始ios中国区下架全部无版号游戏
据媒体报道,苹果早于7月8日就给中国游戏开发者发送邮件,要求游戏开发者必须在7月31日前提交游戏版号及相关文件,否则付费游戏将不可以在中国AppStore供应,8月1日期全部正式下架. 需 ...
- 使用Android Studio创建模拟器,安装配置Android SDK
Android Studio 一个写安卓APP应用的代码编辑器之类的?嗯,应该是... 这里只是需要用到里面的AVD Manager 创建安卓模拟器(也可以用mumu类的安卓模拟器):SDK Mana ...
- 手写IOC实现过程
一.手写ioc前基础知识 1.什么是IOC(Inversion of Control 控制反转)? IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合.更优良 ...
- C#-Func<>
与C#-Action十分相似, Func<> 也是c#内置的委托类型,不同的是, Func<> 只能用来引用具有返回值的方法,也就是说,在使用它时,至少需要在尖括号内指定一种类 ...
- C++中inet_pton、inet_ntop函数
- 头文件windows下:#include <WS2tcpip.h>linux下:#include <sys/socket.h>#include <netinet/in ...
- 2020-04-07:假如你们系统接收十几种报文,用什么方式对应的各自的service,总不能都用if-else判断吧
福哥答案2020-04-08: 策略,工厂.
- 初始化vtable
在InstanceKlass::link_class_impl()方法中完成方法连接后会继续初始化vtable与itable,之前已经介绍过vtable与itable,并且在类解析过程中已经完成了大小 ...
- Git使用之submodule
入职第一周,就因为clone项目而产生了很大的障碍,花了差不多三四个小时才定位问题并解决,记录一下. 一.问题 当我们在使用Git克隆项目的时候,无法克隆下来一个文件夹.记该文件夹为A,A在远程仓库是 ...
- python 在目标位置建立文件夹
import os path = r'D:\pywork\12' # 指定位置 if not os.path.exists(path + '/' + '任务集'): #如果目标位置 不存在该文件夹“任 ...
- Android CC框架中,新建组件无法显示布局问题
出错: 当在创建新的组件时,跳转到新组件成功,但是无法正确显示布局,即获取到布局文件的控件等. 原因: 当在创建新的组件时,默认生成MainActivity以及其布局activity_main.每个组 ...