广度优先搜索(BFS)----------------(TjuOj1140_Dungeon Master)
这次整理了一下广度优先搜索的框架,以后可以拿来直接用了。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(但不一定有解),原文如下:
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 L, R 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 L, R 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)的更多相关文章
- 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)
深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...
- 利用广度优先搜索(BFS)与深度优先搜索(DFS)实现岛屿个数的问题(java)
需要说明一点,要成功运行本贴代码,需要重新复制我第一篇随笔<简单的循环队列>代码(版本有更新). 进入今天的主题. 今天这篇文章主要探讨广度优先搜索(BFS)结合队列和深度优先搜索(DFS ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析
转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...
- 【数据结构与算法Python版学习笔记】图——词梯问题 广度优先搜索 BFS
词梯Word Ladder问题 要求是相邻两个单词之间差异只能是1个字母,如FOOL变SAGE: FOOL >> POOL >> POLL >> POLE > ...
- 广度优先搜索 BFS 学习笔记
广度优先搜索 BFS 学习笔记 引入 广搜是图论中的基础算法之一,属于一种盲目搜寻方法. 广搜需要使用队列来实现,分以下几步: 将起点插入队尾: 取队首 \(u\),如果 $u\to v $ 有一条路 ...
- 广度优先搜索(BFS)
定义 维基百科:https://en.wikipedia.org/wiki/Breadth-first_search 给定图G=(V,E)和一个可识别的源结点s,广度优先搜索对图G中的边进行系统性的探 ...
- 数据结构和算法总结(一):广度优先搜索BFS和深度优先搜索DFS
前言 这几天复习图论算法,觉得BFS和DFS挺重要的,而且应用比较多,故记录一下. 广度优先搜索 有一个有向图如图a 图a 广度优先搜索的策略是: 从起始点开始遍历其邻接的节点,由此向外不断扩散. 1 ...
- 深度优先搜索DFS和广度优先搜索BFS
DFS简介 深度优先搜索,一般会设置一个数组visited记录每个顶点的访问状态,初始状态图中所有顶点均未被访问,从某个未被访问过的顶点开始按照某个原则一直往深处访问,访问的过程中随时更新数组visi ...
- (转)广度优先搜索BFS和深度优先搜索DFS
1. 广度优先搜索介绍 广度优先搜索算法(Breadth First Search),又称为"宽度优先搜索"或"横向优先搜索",简称BFS. 它的思想是:从图中 ...
- 广度优先搜索 BFS算法
广度优先搜索算法(Breadth-First-Search,BFS),又称作宽度优先搜索.BFS算法是从根节点开始,沿着树的宽度遍历树的节点.如果所有节点均被访问,则算法中止. 算法思想 1.首先将根 ...
随机推荐
- ace -- about
Built for Code Ace is an embeddable code editor written in JavaScript. It matches the features and p ...
- YQCB冲刺第二周绩效评价
标准队员 工作质量 20% 工作态度 20% 工作量 30% 工作难易程度 20% 团队意识 10% 总分 陈美琪 17 18 24 17 9 85 张晨阳 19 19 27 19 9 93 刘昭为 ...
- 重温jsp①
Jsp就是一个servlet servlet的缺点 不适合设置html响应体,需要response.Getwriter.print(); 优点:动态资源,可以编程. Jsp:在原有的html中加入了J ...
- 在 Ubuntu16.04 中搭建 Spark 单机开发环境 (JDK + Scala + Spark)
1.准备 本文主要讲述如何在Ubuntu 16.04 中搭建 Spark 2.11 单机开发环境,主要分为 3 部分:JDK 安装,Scala 安装和 Spark 安装. JDK 1.8:jdk-8u ...
- VS2013新建web项目时出错,系统找不到指定文件
好不容易找了一个VS2013_RTM_ULT_CHS来安装好,Key:BWG7X-J98B3-W34RT-33B3R-JVYW9 兴高采烈的打开vs2013,新建web项目,结果弹出一个错误: 傻眼了 ...
- final-review
小组名称:飞天小女警 项目名称:礼物挑选小工具 小组成员:沈柏杉(组长).程媛媛.杨钰宁.谭力铭 会议时间:12月2号12点 会议内容: 设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是 ...
- Oracle client 使用 .net程序连接 数据库时 出现 8.1.7 的解决办法
1. GS产品 连接oracle数据库时出现错误图示 2. 其实解决这个问题的办法很简单 一般是 修改一下 Oracle的app 目录的权限 最简单的办法是增加 everyone 权限 然后重启机器即 ...
- 使用alpine的docker镜像下 dind 的方式安装dotnet core 的一个非dockerfile的方法
1. 下载dind的镜像 docker pull docker:dind 2. 执行该镜像 docker run -it --privileged --name some-docker -d dock ...
- SpringBoot(十四)_springboot使用内置定时任务Scheduled的使用(一)
为什么使用定时? 日常工作中,经常会用到定时任务,比如各种统计,并不要求实时性.此时可以通过提前设置定时任务先把数据跑出来,后续处理起来更方便. 本篇文章主要介绍 springboot内置定时任务. ...
- Java进阶之路
Java进阶之路——从初级程序员到架构师,从小工到专家. 怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序 ...