广度优先搜索(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.首先将根 ...
随机推荐
- Linux DDos防御
今天要说的就是一款能够自动屏蔽DDOS攻击者IP的软件:DDoS deflate. DDoS deflate介绍 DDoS deflate是一款免费的用来防御和减轻DDoS攻击的脚本.它通过netst ...
- Hexo初体验
title: Hexo初体验 date: 2018-05-10 tags: Hexo categories: Hexo --- Hexo本地安装 Node.js安装 Hexo npm安装如下 npm ...
- centos7 设置静态IP
centos7 设置静态IP 一.查找配置文件(/etc/sysconfig/network-scripts) [root@bogon network-scripts]# ll 总用量 232 -rw ...
- Linux内核分析(第三周)
构造一个简单的linux系统menuOS. 一.简介 1.两把宝剑:中断-上下文的切换(保存现场和恢复现场) 进程-上下文的切换 2.linux-3.18.6 arch/x86目录下的代码是我们重点关 ...
- 第二阶段冲刺——seven
个人任务: 马佳慧:设计界面背景,统一风格. 王金萱:整体运行测试上传到公网上的程序. 季方:修改优化已上传的代码. 司宇航:整体调试程序继续优化. 站立会议: 任务看板和燃尽图:
- CentOS下部署Jupyter
目录 安装 配置 准备密码密文 生成配置文件 修改配置 启动 参考:在服务器搭建Jupyter notebook 安装 为了环境比较轻,使用pip安装,非Anaconda: # 创建Python虚拟环 ...
- Triangle Counting UVA - 11401(递推)
大白书讲的很好.. #include <iostream> #include <cstring> using namespace std; typedef long long ...
- The Super Powers UVA - 11752(合数幂)
题意: 求1~2^64-1之间所有的 至少是两个不同的正整数的幂的数 升序输出 一个数的合数次幂即为这样的数 找出1~2^64-1中所有数的合数次幂 用set存起来(既能防止重复 又能升序) 最后输 ...
- codeforces 889A
A. Petya and Catacombs time limit per test 1 second memory limit per test 256 megabytes input standa ...
- noip2018 d2t3 保卫王国 解题报告
保卫王国 电脑卡懒得把题面挪过来了. 朴素 \[ dp_{i,0}=\sum dp_{s,1}\\ dp_{i,1}=\sum \min(dp_{s,0},dp_{s,1})+p_i \] 然后直接动 ...