一本通之 一堆迷宫 (Dungeon Master&走出迷宫&走迷宫)
一本通在线崩溃.......
、
有图有真相
这是个三维迷宫,其实和二位迷宫差不多,只是方向多加了2个。
但这个题的输入十分恶心,一度被坑的用cin.ignore(),但还是不过...
它的正确输入方式是这样的
while(scanf("%d%d%d",&n,&m,&s))
{
if(n==&&m==&&s==)break;
for(int i=;i<n;i++)
{for(int j=;j<m;j++)
scanf("%s",a[i][j]);
}
for(int i=;i<n;i++)
{for(int j=;j<m;j++)
{for(int k=;k<s;k++)
{if(a[i][j][k]=='S')
{sx=i;sy=j;sz=k;
}
if(a[i][j][k]=='#')
{vis[i][j][k]=;
}
if(a[i][j][k]=='E')
{fx=i;fy=j;fz=k;
}
}
}
}
}
地图是以字符的形式输入的,考虑到字符从下标0开始读入,这个题更加的恶心了....
那就把整个地图的下标从0开始算吧。
但是这个地图十分难画,因为像上面那样读入,第一个下标是层数(z轴),而不是x轴。既然如此,我们让z轴与x轴互换,对结果没有影响。
接下来就是套迷宫题的模板
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int sx,sy,sz,fx,fy,fz,n,m,s;
int dx[]={,-,,,,},dy[]={,,-,,,},dz[]={,,,,,-};
struct dl{
int x,y,z,ds;
dl(int xx,int yy,int zz,int ds):x(xx),y(yy),z(zz),ds(ds){}
};
bool vis[][][];
char a[][][];
bool hf(int xx,int yy,int zz)
{if(xx<||xx>=n||yy<||yy>=m||zz<||zz>=s)return ;
if(vis[xx][yy][zz])return ;
return ;
}
void bfs()
{queue<dl>q;
vis[sx][sy][sz]=;
q.push(dl(sx,sy,sz,));
/*for(int i=0;i<=n;i++)
{for(int j=0;j<m;j++)
for(int k=0;k<s;k++)
{printf("vis[%d][%d][%d]=%d ",i,j,k,vis[i][j][k]);
}
printf("\n");
}*/
while(!q.empty())
{
dl ex=q.front();
q.pop(); for(int i=;i<;i++)
{int xx=ex.x,yy=ex.y,zz=ex.z;
xx+=dx[i];yy+=dy[i];zz+=dz[i];
if(hf(xx,yy,zz))
{vis[xx][yy][zz]=;
//printf("xx=%d,yy=%d,zz=%d\n",xx,yy,zz);
int an=ex.ds+;
q.push(dl(xx,yy,zz,an));
}
if(xx==fx&&yy==fy&&zz==fz)
{printf("Escaped in %d minute(s).\n",ex.ds);return ;
}
}
}
printf("Trapped!\n");
}
int main()
{
while(scanf("%d%d%d",&n,&m,&s))
{memset(vis,,sizeof(vis));
if(n==&&m==&&s==)break;
for(int i=;i<n;i++)
{for(int j=;j<m;j++)
scanf("%s",a[i][j]);
}
for(int i=;i<n;i++)
{for(int j=;j<m;j++)
{for(int k=;k<s;k++)
{if(a[i][j][k]=='S')
{sx=i;sy=j;sz=k;
}
if(a[i][j][k]=='#')
{vis[i][j][k]=;
}
if(a[i][j][k]=='E')
{fx=i;fy=j;fz=k;
}
}
}
}
bfs();
}
}
至于走出迷宫这个题,完全就是把三维迷宫减少了一个维度,再改一下输入,其余不变
代码如下
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int sx,sy,sz,fx,fy,fz,n,m,s;
int dx[]={,-,,,},dy[]={,,-,};
struct dl{
int x,y,ds;
dl(int xx,int yy,int ds):x(xx),y(yy),ds(ds){}
};
bool vis[][];
char a[][];
bool hf(int xx,int yy)
{if(xx<||xx>=n||yy<||yy>=m)return ;
if(vis[xx][yy])return ;
return ;
}
void bfs()
{queue<dl>q;
vis[sx][sy]=;
q.push(dl(sx,sy,));
/*for(int i=0;i<=n;i++)
{for(int j=0;j<m;j++)
for(int k=0;k<s;k++)
{printf("vis[%d][%d][%d]=%d ",i,j,k,vis[i][j][k]);
}
printf("\n");
}*/
while(!q.empty())
{
dl ex=q.front();
q.pop(); for(int i=;i<;i++)
{int xx=ex.x,yy=ex.y;
xx+=dx[i];yy+=dy[i];
if(hf(xx,yy))
{vis[xx][yy]=;
//printf("xx=%d,yy=%d,zz=%d\n",xx,yy,zz);
int an=ex.ds+;
q.push(dl(xx,yy,an));
}
if(xx==fx&&yy==fy)
{printf("%d\n",ex.ds);return ;
}
}
}
}
int main()
{
scanf("%d%d%d",&n,&m);
memset(vis,,sizeof(vis));
for(int i=;i<n;i++)
{
scanf("%s",a[i]);
}
for(int i=;i<n;i++)
{for(int j=;j<m;j++)
{
if(a[i][j]=='S')
{sx=i;sy=j;
}
if(a[i][j]=='#')
{vis[i][j]=;
}
if(a[i][j]=='T')
{fx=i;fy=j;
}
}
}
bfs();
}
走迷宫:把上个题的起点改为(0,0),终点改为(n-1,m-1),输出时+1即可
输出时答案加一是因为我们输出的是出队ex.ds,而不是判断合法,加了1后入队的那个ex.ds,所以当前的出队点距离终点还差一步,所以要+1
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int sx,sy,sz,fx,fy,fz,n,m,s;
int dx[]={,-,,,},dy[]={,,-,};
struct dl{
int x,y,ds;
dl(int xx,int yy,int ds):x(xx),y(yy),ds(ds){}
};
bool vis[][];
char a[][];
bool hf(int xx,int yy)
{if(xx<||xx>=n||yy<||yy>=m)return ;
if(vis[xx][yy])return ;
return ;
}
void bfs()
{queue<dl>q;
vis[sx][sy]=;
q.push(dl(sx,sy,));
/*for(int i=0;i<=n;i++)
{for(int j=0;j<m;j++)
for(int k=0;k<s;k++)
{printf("vis[%d][%d][%d]=%d ",i,j,k,vis[i][j][k]);
}
printf("\n");
}*/
while(!q.empty())
{
dl ex=q.front();
q.pop();
for(int i=;i<;i++)
{int xx=ex.x,yy=ex.y;
xx+=dx[i];yy+=dy[i];
if(hf(xx,yy))
{vis[xx][yy]=;
//printf("xx=%d,yy=%d,zz=%d\n",xx,yy,zz);
int an=ex.ds+;
q.push(dl(xx,yy,an));
}
if(xx==fx&&yy==fy)
{printf("%d\n",ex.ds+);return ;
}
}
}
}
int main()
{
scanf("%d%d%d",&n,&m);
memset(vis,,sizeof(vis));
sx=;sy=;fx=n-;fy=m-;
for(int i=;i<n;i++)
{
scanf("%s",a[i]);
}
for(int i=;i<n;i++)
{for(int j=;j<m;j++)
{
if(a[i][j]=='#')
{vis[i][j]=;
}
}
}
bfs();
}
一本通之 一堆迷宫 (Dungeon Master&走出迷宫&走迷宫)的更多相关文章
- 【译文】走出Java ClassLoader迷宫 Find a way out of the ClassLoader maze
本文是一篇译文.原文:Find a way out of the ClassLoader maze 对于类加载器,普通Java应用开发人员不需要了解太多.但对于系统开发人员,正确理解Java的类加载器 ...
- POJ 2251 Dungeon Master(3D迷宫 bfs)
传送门 Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 28416 Accepted: 11 ...
- UVa532 Dungeon Master 三维迷宫
学习点: scanf可以自动过滤空行 搜索时要先判断是否越界(L R C),再判断其他条件是否满足 bfs搜索时可以在入口处(push时)判断是否达到目标,也可以在出口处(pop时) #i ...
- 走出MFC子类化的迷宫
走出MFC子类化的迷宫 KEY WORDS:子类化 SUBCLASSWINDOW MFC消息机制 许多Windows程序员都是跳过SDK直接进行RAD开发工具[或VC,我想VC应不属于RAD]的学习 ...
- 搜索4--noi6264:走出迷宫
搜索4--noi6264:走出迷宫 一.心得 可以去看看别人的代码,吸收精华 二.题目 6264:走出迷宫 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 当 ...
- POJ 2251 Dungeon Master【三维BFS模板】
Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 45743 Accepted: 17256 Desc ...
- 【POJ - 2251】Dungeon Master (bfs+优先队列)
Dungeon Master Descriptions: You are trapped in a 3D dungeon and need to find the quickest way out! ...
- 棋盘问题(DFS)& Dungeon Master (BFS)
1棋盘问题 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的 ...
- POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路)
POJ 2251 题目大意: 给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径,移动方向可以是上,下,左,右,前,后,六个方向,每移动一次就耗费一分钟,要求输出最快的走出时间.不同L层 ...
随机推荐
- 关于第一次在IDEA上使用lombok时注解完全不起作用
当你第一次在IDEA上使用lombok这个工具包时,如果你没有在setting--->Plugins-->Marketplace-->安装Lombok plugin 同时设置 Set ...
- 剑指Offer 65. 矩阵中的路径 (回溯)
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...
- L2-013 红色警报 (25 分)
L2-013 红色警报 (25 分) 战争中保持各个城市间的连通性非常重要.本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报.注意:若该国本来就不完全 ...
- 使用C语言开发PHP扩展(转)
本篇文章给大家带来的内容是介绍如何使用C语言给PHP写扩展,,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1.在php源码路径的ext文件夹下,新建一个extend_test.de ...
- Servlet抽取的问题-method传递问题+表单提交的问题
隐藏域解决该问题: 其中,hidden就是隐形域. 表单提交的问题: 1.通过按钮实现: 2.通过function中,获取页面元素.submit方法
- D2 有关写博客新的体会以及面向对象
之前几篇博客一大堆废话,着实浪费时间也没啥实际作用.除了总结一些java的知识点外,再用一些比喻或者形象化的语言来表述这些知识点,无可厚非.但是,现在看来,应当减少这种堆满偏理论式偏方法性的内容的博客 ...
- ios 当margin-left margin-right 超过设备宽度
ios 当margin-left margin-right过长,相加超过 超过设备宽度时,导致页面不能上下滚动,目前尚未找到解决办法,记录一下
- cf——C. Serval and Parenthesis Sequence
括号正确匹配问题,应该不难 #include <iostream> #include <cstring> #include <string> #include &l ...
- div 隐藏显示各种例子
<html><head><title>jquery show()</title><script type="text/javascrip ...
- What is the Annotation?
Annotation称为注释或注解,它是一个接口.注解提供了一种为程序元素(类.方法.成员变量等)设置元数据(描述其它数据的数据)的方法.编译器.开发工具或其它程序中可以通过反射来获取程序中的Anno ...