BFS 路径记录
有一迷宫 N*M,要求输出可通行的最短路径。
可以先倒着 BFS 一遍迷宫,这样 dis[] 数组储存的就是各点到迷宫终点的最短距离。
然后再从起点开始 BFS 一遍 dis[] ,只要满足 dis[nx][ny] + 1 == dis[x][y] 就可以。
我们以第十届蓝桥省赛C++B组迷宫为例:
【问题描述】
下图给出了一个迷宫的平面图,其中标记为 的为障碍,标记为 的为可 以通行的地方。 迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这个它的上、下、左、右四个方向之一。
对于上面的迷宫,从入口开始,可以按DRRURRDDDR 的顺序通过迷宫,一共10步。其中 D、U、L、R 分别表示向下、向上、向左、向右走。
对于下面这个更复杂的迷宫( 行 列),请找出一种通过迷宫的方式, 其使用的步数最少,在步数最少的前提下,请找出字典序最小的一个作为答案。
请注意在字典序中D<L<R<U。(如果你把以下文字复制到文本文件中,请务 必检查复制的内容是否与文档中的一致。
在试题目录下有一个文件 maze.txt, 内容与下面的文本相同)
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个字符串,包含四种字母 D、U、L、R,在提交答案时只填写这个字符串,填写多余的内容将无法得分。
答案是:
DDDDRRURRRRRRDRRRRDDDLDDRDDDDDDDDDDDDRDDRRRURRUURRDDDDRDRRRRRRDRRURRDDDRRRRUURUUUUUUULULLUUUURRRRUULLLUUUULLUUULUURRURRURURRRDDRRRRRDDRRDDLLLDDRRDDRDDLDDDLLDDLLLDLDDDLDDRRRRRRRRRDDDDDDRR
AC code:
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
#define MAX_N 100
int INF = 0x3f3f3f3f;
char maze[MAX_N][MAX_N];
int dis[MAX_N][MAX_N];
bool vis[MAX_N][MAX_N];
string s;
int dir[][] = {, , , -, , , -, };
char print[] = "DLRU";
int N, M; void BFS (int sx, int sy, int fx, int fy) {
queue<pair<int, int>> q;
q.push(make_pair(sx, sy));
dis[sx][sy] = ;
vis[sx][sy] = true;
while (!q.empty()) {
int x = q.front() .first;
int y = q.front().second;
q.pop();
for (int i = ; i < ; i++) {
int nx = x + dir[i][];
int ny = y + dir[i][];
if (nx >= && nx < N && ny >= && ny < M && maze[nx][ny] == '' && vis[nx][ny] == false && dis[nx][ny] == INF) {
dis[nx][ny] = dis[x][y] + ;
vis[nx][ny] = true;
q.push(make_pair(nx, ny));
}
}
}
}
void BFSprint (int sx, int sy) {
queue<pair<int, int>> q;
q.push(make_pair(sx,sy));
while (!q.empty()) {
int x = q.front().first;
int y = q.front().second;
q.pop();
for (int i = ; i < ; i++){
int nx = x + dir[i][];
int ny = y + dir[i][];
if (nx >= && nx < N && ny >= && ny < M && dis[nx][ny] + == dis[x][y]){
cout << print[i];
q.push(make_pair(nx, ny));
break;
}
}
}
}
int main(){
memset(dis,INF,sizeof(dis));
cin >> N >> M;
for (int i = ; i < N; i++)
for (int j = ; j < M; j++)
cin >> maze[i][j];
BFS(N - , M - , , );
cout << dis[][] << endl;
BFSprint(, );
}
BFS 路径记录的更多相关文章
- poj--3984--迷宫问题(bfs+路径记录)
迷宫问题 Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Submit Status D ...
- poj 3984 迷宫问题【bfs+路径记录】
迷宫问题 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10103 Accepted: 6005 Description ...
- POJ 3984 迷宫问题【BFS/路径记录/手写队列】
迷宫问题 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 31428 Accepted: 18000 Description 定义 ...
- POJ-3894 迷宫问题 (BFS+路径还原)
定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, ...
- Charlie's Change_完全背包&&路径记录
Description Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie drives a lot and so he ofte ...
- ros机器人之小乌龟仿真-路径记录
------------恢复内容开始------------ 通过自己不断地摸索,对ros系统有了一定的了解,首先装系统,这一过程中也遇到了很多问题,但通过不断地尝试,经过一天一夜的倒腾,总算是把系统 ...
- Android中的路径记录
Android中的路径记录 | RobinBlog 导航 导航 博客 分类 标签 友链 关于 搜索 Environment.getDataDirectory().getPath()=/dataEnvi ...
- 剑指 Offer 34. 二叉树中和为某一值的路径 + 记录所有路径
剑指 Offer 34. 二叉树中和为某一值的路径 Offer_34 题目详情 题解分析 本题是二叉树相关的题目,但是又和路径记录相关. 在记录路径时,可以使用一个栈来存储一条符合的路径,在回溯时将进 ...
- HDU1026 Ignatius and the Princess I 【BFS】+【路径记录】
Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
随机推荐
- AngularJS实现可伸缩的页面切换
AngularJS实现可伸缩的页面切换 AngularJS 1.2 通过引入基于纯CSS class的切换和动画,在一个单页面应用创建页面到页面的切换变得更加的容易.只需要使用一个ng-view,让我 ...
- C#中的double类型数据向SQL sqerver 存储与读取问题
1.存储 由于double类型在SQLsever中并没有对应数据,试过对应float.real类型,发现小数位都存在四舍五入的现象,目前我使用的是decimal类型,用此类型时个人觉得小数位数应该比自 ...
- 关于systemctl
systemctl是CentOS7的服务管理工具中主要的工具,它融合之前service和chkconfig的功能于一体. 启动一个服务:systemctl start firewalld.servic ...
- docker基本知识
- 160A
#include <stdio.h> int main() { int n; int sum1=0, sum2=0, sum3=0; int x, y, z; scanf("%d ...
- linux安装lamp/lamp/lanmp
wdcp安装lamp/lanp/lanmp 和宝塔(centOS)1. yum install -y wget //yum安装wegt2. wget http://dl.wdlinux.cn/fil ...
- Deeplab v3+的结构的理解,图像分割最新成果
Deeplab v3+ 结构的精髓: 1.继续使用ASPP结构, SPP 利用对多种比例(rates)和多种有效感受野的不同分辨率特征处理,来挖掘多尺度的上下文内容信息. 解编码结构逐步重构空间信息来 ...
- 初识GitHub之创建文件
在新建了一个项目(repository)后,会跳转到项目主页,如下图 Create new file(创建新文件)就是新建一个代码文件,Upload file(上传文件)即从内存中将代码文件上传至本项 ...
- mysql的一些指令
说起来mysql,mysql其实是特别简单操作的数据库.它有一下几方面的特点,亦或者是说优点,1,支持多语言:2.移植性比较好:3,我觉得最重要的一点就是它是开源的,因为开源,所以使用广泛,4.效率比 ...
- Scala--reduceLeft
reduceLeft神语法 val a = Array(20, 12, 6, 15, 2, 9) 1 2 3 4 5 6 7 8 scala> a.reduceLeft(_ + _) // 数 ...