SDUT2193_救基友记3(BFS三维)

2024-09-04 08:58
文章标签 bfs 三维 救基友 sdut2193

本文主要是介绍SDUT2193_救基友记3(BFS三维),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

救基友记3

Time Limit: 1000MS Memory limit: 65536K

题目描述

  话说 CZ 由于不守基道,被妖怪抓走了,好基友 WP 在努力讨好高富帅 RQ 救出 CZ 的同时, CZ 也意识到了自己的错误,然后努力的想逃出妖怪的闺房。 
   妖怪的闺房是一个n*m的矩阵,并且某些地方安装了带锁的门,钥匙藏在闺房另外的某些地方。刚开始WP被关在(sx,sy)的位置,离开闺房的门在(ex,ey)的位置。WP每分钟只能从一个坐标走到相邻四个坐标中的其中一个。妖怪每t分钟回闺房视察一次,若发现CZ不在原位置便把他再拎回去。经过若干次的尝试,CZ已画出整个闺房的地图。现在请你帮他计算能否再次成功逃亡。只要在妖怪下次视察之前走到出口就算离开闺房,如果妖怪回来的时候刚好走到出口或还未到出口都算逃亡失败。

输入

每组测试数据的第一行有三个整数 n,m,t(2<=n,m<=20,t>0)。接下来的 nm列为闺房的地图,其中包括 :
代表路
代表墙
代表CZ的起始位置
代表闺房的出口
A-J 代表带锁的门,对应的钥匙分别为a-j
a-j 代表钥匙,对应的门分别为A-J

每组测试数据之间有一个空行。

输出

针对每组测试数据,如果可以成功逃亡,请输出最少需要多少分钟才能离开,如果不能则输出 -1

示例输入

4 5 17
@A.B.
a*.*.
*..*^
c..b*4 5 16
@A.B.
a*.*.
*..*^
c..b*

示例输出

16
-1


解题报告
这是一题bfs的三维题。。。
把钥匙当成三维状态下的z轴,用二进制表示钥匙的有无,如0100100代表b和e的钥匙有。走到门的地方都要判断是否有该门的钥匙,有的话可以当作路走,没有的话当作墙。
走到钥匙的地方判断是否有该门的钥匙,有的话不要捡钥匙,没有的话捡起钥匙。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
//#define
using namespace std;struct node
{int x,y,key,num;
} q[1000000];
int n,m,t;
char mmap[25][25];
int v[100][100][100];
int dx[]= {-1,0,1,0};
int dy[]= {0,1,0,-1};
int iskey(char c,int num)
{int na,b;if(c>='A'&&c<='Z')na=c-'A';elsena=c-'a';for(int i=0; i<=na; i++){b=num%2;num/=2;}return b;
}
int bfs(int x,int y)
{node now,next;now.x=x;now.y=y;now.num=0;now.key=0;int t=0,f=0;int i;q[f++]=now;v[now.x][now.y][now.key]=1;while(t<f){now=q[t++];//printf("x=%d,y=%d,num=%d,key=%d\n",now.x,now.y,now.num,now.key);if(mmap[now.x][now.y]=='^'){return now.num;}for(i=0; i<4; i++){next.x=now.x+dx[i];next.y=now.y+dy[i];next.key=now.key;if(next.x>=0&&next.x<n&&next.y>=0&&next.y<m&&mmap[next.x][next.y]!='*'&&!v[next.x][next.y][next.key]){if(mmap[next.x][next.y]>='a'&&mmap[next.x][next.y]<='j'){if(!iskey(mmap[next.x][next.y],next.key)){next.key+=pow(2,mmap[next.x][next.y]-'a');}next.num=now.num+1;q[f++]=next;v[next.x][next.y][next.key]=1;}else if(mmap[next.x][next.y]>='A'&&mmap[next.x][next.y]<='J'){if(iskey(mmap[next.x][next.y],next.key)){next.num=now.num+1;q[f++]=next;v[next.x][next.y][next.key]=1;}}else{next.num=now.num+1;q[f++]=next;v[next.x][next.y][next.key]=1;}}}}return -1;
}
int main()
{int i,j;while(scanf("%d%d%d",&n,&m,&t)!=EOF){for(int i=0; i<n; i++)scanf("%s",mmap[i]);for(i=0; i<n; i++){for(j=0; j<m; j++){if(mmap[i][j]=='@'){break;}}if(j<m)break;}int ff=bfs(i,j);if(ff<t)printf("%d\n",ff);else printf("-1\n");}
}



这篇关于SDUT2193_救基友记3(BFS三维)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1135565

相关文章

hdu1254(嵌套bfs,两次bfs)

/*第一次做这种题感觉很有压力,思路还是有点混乱,总是wa,改了好多次才ac的思路:把箱子的移动当做第一层bfs,队列节点要用到当前箱子坐标(x,y),走的次数step,当前人的weizhi(man_x,man_y),要判断人能否将箱子推到某点时要嵌套第二层bfs(人的移动);代码如下:

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

hdu4826(三维DP)

这是一个百度之星的资格赛第四题 题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1004&cid=500 题意:从左上角的点到右上角的点,每个点只能走一遍,走的方向有三个:向上,向下,向右,求最大值。 咋一看像搜索题,先暴搜,TLE,然后剪枝,还是TLE.然后我就改方法,用DP来做,这题和普通dp相比,多个个向上

poj 2195 bfs+有流量限制的最小费用流

题意: 给一张n * m(100 * 100)的图,图中” . " 代表空地, “ M ” 代表人, “ H ” 代表家。 现在,要你安排每个人从他所在的地方移动到家里,每移动一格的消耗是1,求最小的消耗。 人可以移动到家的那一格但是不进去。 解析: 先用bfs搞出每个M与每个H的距离。 然后就是网络流的建图过程了,先抽象出源点s和汇点t。 令源点与每个人相连,容量为1,费用为

POJ 3057 最大二分匹配+bfs + 二分

SampleInput35 5XXDXXX...XD...XX...DXXXXX5 12XXXXXXXXXXXXX..........DX.XXXXXXXXXXX..........XXXXXXXXXXXXX5 5XDXXXX.X.DXX.XXD.X.XXXXDXSampleOutput321impossible

深度优先(DFS)和广度优先(BFS)——算法

深度优先 深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支,当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访

Vector3 三维向量

Vector3 三维向量 Struct Representation of 3D vectors and points. 表示3D的向量和点。 This structure is used throughout Unity to pass 3D positions and directions around. It also contains functions for doin

数据集 3DPW-开源户外三维人体建模-姿态估计-人体关键点-人体mesh建模 >> DataBall

3DPW 3DPW-开源户外三维人体建模数据集-姿态估计-人体关键点-人体mesh建模 开源户外三维人体数据集 @inproceedings{vonMarcard2018, title = {Recovering Accurate 3D Human Pose in The Wild Using IMUs and a Moving Camera}, author = {von Marc

Rhinoceros 8 for Mac/Win:重塑三维建模边界的革新之作

Rhinoceros 8(简称Rhino 8),作为一款由Robert McNeel & Assoc公司开发的顶尖三维建模软件,无论是对于Mac还是Windows用户而言,都是一款不可多得的高效工具。Rhino 8以其强大的功能、广泛的应用领域以及卓越的性能,在建筑设计、工业设计、产品设计、三维动画制作、科学研究及机械设计等多个领域展现出了非凡的实力。 强大的建模能力 Rhino 8支持多种建

数据集 Ubody人体smplx三维建模mesh-姿态估计 >> DataBall

Ubody开源人体三维源数据集-smplx-三维建模-姿态估计 UBody:一个连接全身网格恢复和真实生活场景的上半身数据集,旨在拟合全身网格恢复任务与现实场景之间的差距。 UBody包含来自多人的现实场景的1051k张高质量图像,这些图像拥有2D全身关键点、3D SMPLX模型。 UBody由国际数字经济学院(IDEA)提供。 (UBody was used for mesh r