这次整理了一下广度优先搜索的框架,以后可以拿来直接用了。TjuOj1140是一个三维的迷宫题,在BFS时我增加了一个控制数组,用来对队列的出队进行控制,确保每次出队的结点均为同一步长的结点,个人认为比较适合这种迷宫搜索题。

BFS部分的代码如下:

int BFS ( node S , node T )
{
int s = ; //充当指针作用
memset(n,,sizeof(n));
n[s] = ; //初始化当前距离为1的点数为1(即原点)
node now = S;
visit[now.z][now.y][now.x] = ;
node temp;
queue<node> Q;
Q.push(now);
while( !Q.empty() ){
for(int j = ; j < n[s] ; j++ ){ //依次弹出所有距离为s的方块,进行四周搜索;
now = Q.front();
Q.pop();
for(int i = ; i < ;i++){ //向6个方向探索是否有通路
temp.x = now.x + dx[i];
temp.y = now.y + dy[i];
temp.z = now.z + dz[i];
if( visit[temp.z][temp.y][temp.x] == && inmap(temp) ){ //防止越界访问
temp.ch = maze[temp.z][temp.y][temp.x];
if (temp.ch == "E")
return s;
if (temp.ch == "."){ //如果探索到通路,将该通路标记为(当前距离+1) ,压入队列;
n[s + ]++; //(当前距离+1)的方块个数++
visit[temp.z][temp.y][temp.x] = ;
Q.push(temp);
}
}
}
}
s++;
}
return ;
}

题目比较好理解,从S出发找E(但不一定有解),原文如下:

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 with rock. It takes one minute to move one unit north, south, east, west, up or down. You cannot move diagonally and the maze is surrounded by solid rock on all sides.

Is an escape possible? If yes, how long will it take?

Input Specification

The input file consists of a number of dungeons. Each dungeon description starts with a line containing three integers LR and C (all limited to 30 in size). 
L is the number of levels making up the dungeon. 
R and C are the number of rows and columns making up the plan of each level. 
Then there will follow L blocks of R lines each containing C characters. Each character describes one cell of the dungeon. A cell full of rock is indicated by a '#' and empty cells are represented by a '.'. Your starting position is indicated by 'S' and the exit by the letter 'E'. There's a single blank line after each level. Input is terminated by three zeroes for LR and C.

Output Specification

Each maze generates one line of output. If it is possible to reach the exit, print a line of the form

Escaped in x minute(s).

where x is replaced by the shortest time it takes to escape. 
If it is not possible to escape, print the line

Trapped!

Sample Input

3 4 5
S....
.###.
.##..
###.# #####
#####
##.##
##... #####
#####
#.###
####E 1 3 3
S##
#E#
### 0 0 0

Sample Output

Escaped in 11 minute(s).
Trapped!
/*
* 1140_Dungeon Master.cpp
*
* Created on: 2018年11月14日
* Author: Jeason
*/ #include <iostream>
#include <stdio.h>
#include <cstring>
#include <sstream>
#include <queue>
#define N 70
using namespace std;
int levels,rows,columns;
char maze[N][N][N];
int visit[N][N][N];
int n[ ] = {}; //用于记录每个距离的方块个数;
string line;
int dx[] = {,-,,,,};
int dy[] = {,,,-,,};
int dz[] = {,,,,,-}; struct node {
int x,y,z;
string ch;
}; bool inmap(node A) {
if(A.x < || A.x >= columns) return false;
if(A.y < || A.y >= rows) return false;
if(A.z < || A.z >= levels) return false;
return true;
} int BFS(node S,node T)
{
int s = ; //充当指针作用
memset(n,,sizeof(n));
n[s] = ; //初始化当前距离为1的点数为1(即原点)
node now = S;
visit[now.z][now.y][now.x] = ;
node temp;
queue<node> Q;
Q.push(now);
while( !Q.empty() ){
for(int j = ; j < n[s] ; j++ ){ //依次弹出所有距离为s的方块,进行四周搜索;
now = Q.front();
Q.pop();
for(int i = ; i < ;i++){ //向6个方向探索是否有通路
temp.x = now.x + dx[i];
temp.y = now.y + dy[i];
temp.z = now.z + dz[i];
if( visit[temp.z][temp.y][temp.x] == && inmap(temp) ){ //防止越界访问
temp.ch = maze[temp.z][temp.y][temp.x];
if (temp.ch == "E")
return s;
if (temp.ch == "."){ //如果探索到通路,将该通路标记为(当前距离+1) ,压入队列;
n[s + ]++; //(当前距离+1)的方块个数++
visit[temp.z][temp.y][temp.x] = ;
Q.push(temp);
}
}
}
}
s++;
}
return ;
} int main()
{
node S,T;
cin >> levels >> rows >> columns; while( (levels != )&&(rows != )&&(columns != ) ){
memset(maze, , sizeof(maze)); //读入数据;
memset(visit, , sizeof(visit));
for(int i = ;i < levels ;i++){
for(int j = ;j < rows ;j++){
cin >> line;
for(int k = ;k < columns ;k++){
maze[i][j][k] = line[k];
if(line[k] == 'S'){ //找起点
S.z = i; S.x = k; S.y = j;
S.ch = "S";
}
}
}
}
int minutes = BFS( S, T );
if(minutes != )
cout << "Escaped in "<< minutes << " minute(s)."<< endl;
else
cout << "Trapped!" <<endl;
// for(int i = 0;i < levels ;i++){ //输出地图
// for(int j = 0;j < rows ;j++){
// for(int k = 0;k < columns ;k++){
// cout << maze[i][j][k];
// }
// cout << endl;
// }
// cout << endl;
// }
cin >> levels >> rows >> columns;
} return ;
} /* Sample Input
3 4 5
S....
.###.
.##..
###.# #####
#####
##.##
##... #####
#####
#.###
####E 1 3 3
S##
#E#
### 0 0 0
Sample Output
Escaped in 11 minute(s).
Trapped!
*/

广度优先搜索(BFS)----------------(TjuOj1140_Dungeon Master)的更多相关文章

  1. 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)

    深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...

  2. 利用广度优先搜索(BFS)与深度优先搜索(DFS)实现岛屿个数的问题(java)

    需要说明一点,要成功运行本贴代码,需要重新复制我第一篇随笔<简单的循环队列>代码(版本有更新). 进入今天的主题. 今天这篇文章主要探讨广度优先搜索(BFS)结合队列和深度优先搜索(DFS ...

  3. 深度优先搜索DFS和广度优先搜索BFS简单解析

    转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...

  4. 【数据结构与算法Python版学习笔记】图——词梯问题 广度优先搜索 BFS

    词梯Word Ladder问题 要求是相邻两个单词之间差异只能是1个字母,如FOOL变SAGE: FOOL >> POOL >> POLL >> POLE > ...

  5. 广度优先搜索 BFS 学习笔记

    广度优先搜索 BFS 学习笔记 引入 广搜是图论中的基础算法之一,属于一种盲目搜寻方法. 广搜需要使用队列来实现,分以下几步: 将起点插入队尾: 取队首 \(u\),如果 $u\to v $ 有一条路 ...

  6. 广度优先搜索(BFS)

    定义 维基百科:https://en.wikipedia.org/wiki/Breadth-first_search 给定图G=(V,E)和一个可识别的源结点s,广度优先搜索对图G中的边进行系统性的探 ...

  7. 数据结构和算法总结(一):广度优先搜索BFS和深度优先搜索DFS

    前言 这几天复习图论算法,觉得BFS和DFS挺重要的,而且应用比较多,故记录一下. 广度优先搜索 有一个有向图如图a 图a 广度优先搜索的策略是: 从起始点开始遍历其邻接的节点,由此向外不断扩散. 1 ...

  8. 深度优先搜索DFS和广度优先搜索BFS

    DFS简介 深度优先搜索,一般会设置一个数组visited记录每个顶点的访问状态,初始状态图中所有顶点均未被访问,从某个未被访问过的顶点开始按照某个原则一直往深处访问,访问的过程中随时更新数组visi ...

  9. (转)广度优先搜索BFS和深度优先搜索DFS

    1. 广度优先搜索介绍 广度优先搜索算法(Breadth First Search),又称为"宽度优先搜索"或"横向优先搜索",简称BFS. 它的思想是:从图中 ...

  10. 广度优先搜索 BFS算法

    广度优先搜索算法(Breadth-First-Search,BFS),又称作宽度优先搜索.BFS算法是从根节点开始,沿着树的宽度遍历树的节点.如果所有节点均被访问,则算法中止. 算法思想 1.首先将根 ...

随机推荐

  1. ace -- about

    Built for Code Ace is an embeddable code editor written in JavaScript. It matches the features and p ...

  2. YQCB冲刺第二周绩效评价

    标准队员 工作质量 20% 工作态度 20% 工作量 30% 工作难易程度 20% 团队意识 10% 总分 陈美琪 17 18 24 17 9 85 张晨阳 19 19 27 19 9 93 刘昭为 ...

  3. 重温jsp①

    Jsp就是一个servlet servlet的缺点 不适合设置html响应体,需要response.Getwriter.print(); 优点:动态资源,可以编程. Jsp:在原有的html中加入了J ...

  4. 在 Ubuntu16.04 中搭建 Spark 单机开发环境 (JDK + Scala + Spark)

    1.准备 本文主要讲述如何在Ubuntu 16.04 中搭建 Spark 2.11 单机开发环境,主要分为 3 部分:JDK 安装,Scala 安装和 Spark 安装. JDK 1.8:jdk-8u ...

  5. VS2013新建web项目时出错,系统找不到指定文件

    好不容易找了一个VS2013_RTM_ULT_CHS来安装好,Key:BWG7X-J98B3-W34RT-33B3R-JVYW9 兴高采烈的打开vs2013,新建web项目,结果弹出一个错误: 傻眼了 ...

  6. final-review

    小组名称:飞天小女警 项目名称:礼物挑选小工具 小组成员:沈柏杉(组长).程媛媛.杨钰宁.谭力铭 会议时间:12月2号12点 会议内容: 设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是 ...

  7. Oracle client 使用 .net程序连接 数据库时 出现 8.1.7 的解决办法

    1. GS产品 连接oracle数据库时出现错误图示 2. 其实解决这个问题的办法很简单 一般是 修改一下 Oracle的app 目录的权限 最简单的办法是增加 everyone 权限 然后重启机器即 ...

  8. 使用alpine的docker镜像下 dind 的方式安装dotnet core 的一个非dockerfile的方法

    1. 下载dind的镜像 docker pull docker:dind 2. 执行该镜像 docker run -it --privileged --name some-docker -d dock ...

  9. SpringBoot(十四)_springboot使用内置定时任务Scheduled的使用(一)

    为什么使用定时? 日常工作中,经常会用到定时任务,比如各种统计,并不要求实时性.此时可以通过提前设置定时任务先把数据跑出来,后续处理起来更方便. 本篇文章主要介绍 springboot内置定时任务. ...

  10. Java进阶之路

    Java进阶之路——从初级程序员到架构师,从小工到专家. 怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序 ...