SDUT 1124-飞跃原野--三维BFS

飞跃原野

Time Limit: 5000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

勇敢的法里奥出色的完成了任务之后,正在迅速地向自己的基地撤退。但由于后面有着一大群追兵,所以法里奥要尽快地返回基地,否则就会被敌人逮住。

终于,法里奥来到了最后的一站:泰拉希尔原野,穿过这里就可以回到基地了。然而,敌人依然紧追不舍。不过,泰拉希尔的地理条件对法里奥十分有利,众多的湖泊随处分布。敌人需要绕道而行,但法里奥还是决定找一条能尽快回到基地的路。

假设泰拉希尔原野是一个m*n的矩阵,它有两种地形,P表示平,L表示湖泊,法里奥只能停留在平地上。他目前的位置在左上角(1,1)处,而目的地为右下角的(m,n)。法里奥可以向前后左右4个方向移动或飞行,每移动1格需要1单位时间。而飞行的时间主要花费在变形上,飞行本身时间消耗很短,所以无论一次飞行多远的距离,都只需要1单位时间。飞行的途中不能变向,并且一次飞行最终必须要降落到平地上。当然,由于受到能量的限制,法里奥不能无限制飞行,他总共最多可以飞行的距离为D。在知道了以上的信息之后,请你帮助法里奥计算一下,他最快到达基地所需要的时间。

输入

第一行是3个整数,m(1≤m≤100),n(1≤n≤100),D(1≤D≤100)。表示原野是m*n的矩阵,法里奥最多只能飞行距离为D。接下来的m行每行有n个字符,相互之间没有空格。P表示当前位置是平地,L则表示湖泊。假定(1,1)和(m,n)一定是平地。

输出

一个整数,表示法里奥到达基地需要的最短时间。如果无法到达基地,则输出impossible。

示例输入

4 4 2
PLLP
PPLP
PPPP
PLLP

示例输出

5

QAQ用二维的bfs怒搜8个方向就是过不去,Wjj说是要状态同步只能用三维,sad 还是对三维比较不敏感,没往那方面想。
这道题,以行和列为x,y,以飞行距离D为z 建立三维搜索思想,然后每次在4个方向分别让它行走和飞行。其他的没什么了。
#include <cstdio>//BFS
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
char ma[110][110];
bool vis[110][110][110];
typedef struct node
{
	int x,y,d,time;
};
int n,m,d;
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
void bfs()
{
  queue <node> Q;
  node t;int i,j;
  t.x=0;t.y=0;t.time=0;t.d=d;
  Q.push(t);
  while(!Q.empty())
  {
  	node v=Q.front(); Q.pop();
  	if(v.x==m-1&&v.y==n-1)
	{
		cout<<v.time<<endl;
		return ;
	}
  	for(i=0;i<4;i++)
	{
		t.x=v.x+dir[i][0];
		t.y=v.y+dir[i][1];
		t.d=v.d;
		if(t.x>=0&&t.x<m&&t.y>=0&&t.y<n&&!vis[t.x][t.y][t.d]&&ma[t.x][t.y]=='P')//run
		{
			vis[t.x][t.y][t.d]=1;
			t.time=v.time+1;
			Q.push(t);
		}
		for(j=2;j<=v.d;j++)//fly
		{
			t.x=v.x+j*dir[i][0];
			t.y=v.y+j*dir[i][1];
			if(t.x>=0&&t.x<m&&t.y>=0&&t.y<n&&!vis[t.x][t.y][v.d-j]&&ma[t.x][t.y]=='P')
			{
				vis[t.x][t.y][v.d-j]=1;
				t.d=v.d-j;
				t.time=v.time+1;
				Q.push(t);
			}
		}
	}
  }
  puts("impossible");
}
int main()
{
	int i,j;
	while(cin>>m>>n>>d)
	{
		memset(vis,0,sizeof(vis));
		for(i=0;i<m;i++)
			cin>>ma[i];
		bfs();
	}
    return 0;
}




SDUT 1124-飞跃原野--三维BFS

时间: 2024-10-20 11:38:48

SDUT 1124-飞跃原野--三维BFS的相关文章

SDUT OJ 1124 飞越原野 (三维BFS练习)

飞跃原野 Time Limit: 5000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 勇敢的法里奥出色的完成了任务之后,正在迅速地向自己的基地撤退.但由于后面有着一大群追兵,所以法里奥要尽快地返回基地,否则就会被敌人逮住. 终于,法里奥来到了最后的一站:泰拉希尔原野,穿过这里就可以回到基地了.然而,敌人依然紧追不舍.不过,泰拉希尔的地理条件对法里奥十分有利,众多的湖泊随处分布.敌人需要绕道而行,但法里奥还是决定找一条能尽快回到基地的路. 假设泰拉希尔原野

POJ - 2251 Dungeon Master(三维BFS)

题目链接:http://poj.org/problem?id=2251 题意:三维BFS. 题解:大水题,只不过多加了两个方向 1 //poj2251 2 #include <queue> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 int sx,sy,sz,ex,ey,ez,L,R,C; 8 const int INF=

[ACM] hdu 1253 胜利大逃亡 (三维BFS)

胜利大逃亡 Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,现在知道魔王将在T分钟后回到城堡,Ignatius每分钟能从一个坐标走到相邻的六个坐标中的其中一个.现在给你城堡的地图,请你计算出Ignatius能否在魔王回来前离开城堡(只要走到出

hdu 1885 Key Task (三维bfs)

题目 之前比赛的一个题, 当时是崔老师做的,今天我自己做了一下.... 还要注意用bfs的时候  有时候并不是最先到达的就是答案,比如HDU 3442 这道题是要求最小的消耗血量伤害,但是并不是最先到达目标点的路径 就是最小的伤害,因为每一个点的伤害是 不一样的, 这种情况要用优先队列优化, 对伤害优化. 题意:*开始, X出口, b, y, r, g 代表钥匙,分别可以开B, Y, R, G颜色的门, 钥匙可以多次使用.问最短的步骤. 思路:vis[][][]数组开三维,第三维记录状态 是否拿

POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路)

POJ 2251 题目大意: 给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径,移动方向可以是上,下,左,右,前,后,六个方向,每移动一次就耗费一分钟,要求输出最快的走出时间.不同L层的地图,相同RC坐标处是相连通的.(.可走,#为墙) 解题思路:从起点开始分别往6个方向进行BFS(即入队),并记录步数,直至队为空.若一直找不到,则困住. /* POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路) */ #include <cstdio> #i

三维bfs(HUD1253胜利大逃亡)

#include <stdio.h>#include <string.h>int map[51][51][51];int v[51][51][51];int a,b,c,t11;struct node{ int x,y,z,ans;}q[200001];int jx[6]={0,0,0,0,-1,1};int jy[6]={0,0,1,-1,0,0};int jz[6]={1,-1,0,0,0,0};void bfs(){ memset(v,0,sizeof(v)); struct

HDU 1253:胜利大逃亡(简单三维BFS)

胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 24937    Accepted Submission(s): 9535 Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的

POJ 2251:Dungeon Master(三维BFS)

Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16178 Accepted: 6268 Description You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of unit cubes which may or may not be filled wit

HDU1240-题目意思详解( 三维BFS)

题目大意:先输入START N 表示这个立方体的层数是N,每一层为一个NxN的正方形..其实就是一个NxNxN的正方体,输入时一层一层的输入. 输入完立方体后,输入起点和终点的坐标. 输出是 先输出 N 再输出最短路径的步数.如果走不到终点,输出NO ROUTE. 坑点:它输入的起点和终点坐标不与我们输入的立方体对应. #include <cstdio> #include <cstring> #include <iostream> #include <queue&