有一迷宫 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 路径记录的更多相关文章

  1. poj--3984--迷宫问题(bfs+路径记录)

    迷宫问题 Time Limit: 1000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Submit Status D ...

  2. poj 3984 迷宫问题【bfs+路径记录】

    迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10103   Accepted: 6005 Description ...

  3. POJ 3984 迷宫问题【BFS/路径记录/手写队列】

    迷宫问题 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 31428 Accepted: 18000 Description 定义 ...

  4. 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, ...

  5. Charlie's Change_完全背包&&路径记录

    Description Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie drives a lot and so he ofte ...

  6. ros机器人之小乌龟仿真-路径记录

    ------------恢复内容开始------------ 通过自己不断地摸索,对ros系统有了一定的了解,首先装系统,这一过程中也遇到了很多问题,但通过不断地尝试,经过一天一夜的倒腾,总算是把系统 ...

  7. Android中的路径记录

    Android中的路径记录 | RobinBlog 导航 导航 博客 分类 标签 友链 关于 搜索 Environment.getDataDirectory().getPath()=/dataEnvi ...

  8. 剑指 Offer 34. 二叉树中和为某一值的路径 + 记录所有路径

    剑指 Offer 34. 二叉树中和为某一值的路径 Offer_34 题目详情 题解分析 本题是二叉树相关的题目,但是又和路径记录相关. 在记录路径时,可以使用一个栈来存储一条符合的路径,在回溯时将进 ...

  9. 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 ...

随机推荐

  1. Java ee第四周作业

    代码下载链接:https://github.com/javaee/tutorial-examples/tree/master/web/jsf/hello1 代码内容: /*** Copyright ( ...

  2. 删除64位ODBC数据源DNS

    1.按照打开管理工具-打开数据源(ODBC),进入如下界面,选择用户DSN删除,发现报错一直删除不了. 2.成功删除:进入如下图路径,打开ODBC数据源管理工具,选择要删除的DSN就可以成功删除啦.

  3. C# 如何使用长度来切分字符串

    参考网址:https://blog.csdn.net/yenange/article/details/39637211 using System; using System.Collections.G ...

  4. Linux平台 Oracle 18c RAC安装Part2:GI配置

    三.GI(Grid Infrastructure)安装 3.1 解压GI的安装包 3.2 安装配置Xmanager软件 3.3 共享存储LUN的赋权 3.4 使用Xmanager图形化界面配置GI 3 ...

  5. 【Checkio Exercise】Three Point Circle

    计算三角形外接圆的函数: Three Point Circle If we want to build new silos, then we need to make more formal and ...

  6. 【Spark-core学习之九】 Spark案例

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...

  7. photoshop cc 安装失败 2%

    photoshop cc 安装失败 2%   C盘--Program Files---Common Files--Adobe--caps ,把这个文件夹中的文件全部删除,然后再安装     C:\Pr ...

  8. Oarcle的开始

    1.数据库大致分类两种 1.关系型数据库(SQL) Oracle.Mysql(80%).DB2.Microsoft SQL Server.ProsgreSQL.Access.SQLSite 2.非关系 ...

  9. react脚手架搭建及配置

    npm install -g create-react-app 装完之后,生成一个新的项目,可以使用下面的命令: create-react-app my-app cd my-app/yarn star ...

  10. the network could not establish the connection

    为了方便建表等操作,我用sql developer 连接linux 底下的数据库,可连接时出现了这个问题the network could not establish the connection. ...