有一迷宫 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. DELPHI中完成端口(IOCP)的简单分析(1)

    DELPHI中完成端口(IOCP)的简单分析(1)   用DELPHI开发网络代码已经有一段时间了! 我发现在网上用VC来实现完成端口(IOCP)的代码很多,但是使用DELPHI来实现的就比较少了.对 ...

  2. LeetCode 206 Reverse Linked List 解题报告

    题目要求 Reverse a singly linked list. Example: Input: 1->2->3->4->5->NULL Output: 5-> ...

  3. SharePoint开启错误提示

    1,打开80下面的Web.config文件2,CallStack="true" 和 <customErrors mode="Off" /> < ...

  4. 467A

    #include <stdio.h> int main() { int n; int p, q; int rooms=0; scanf("%d", &n); i ...

  5. Software Testing 1 —— 有关编程错误的经历

    最令我印象深刻的程序错误几乎都是那些细节,具体的记不清了,因为真的很细.他们不会报正常的错,要么是时而可以正常运行,时而不能正常运行但是没有报错,比如闪退或者持续运行没有输出:要么是报的错误意义很宽泛 ...

  6. matlab之导入txt文件并取其中一列数据

    1.我想导入下面这个文件的内容,并且获取这个文件中的两列数据. 2.首先确保Matlab当前所在文件夹为txt文件所在文件夹,然后命令行执行: X = load('2019_03_21_08_59_0 ...

  7. linux下sublime输入中文

    title: linux下sublime输入中文 date: 2017-11-09 20:54:43 tags: sublime categories: 开发工具 archlinux系统 下载文件 g ...

  8. 【Checkio Exercise】Robot Sort

    Robot Sort All of the refined ingots should be sorted by size in each lot while passing by on a conv ...

  9. NOIP2012借教室

    题目描述 Description 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海 ...

  10. Painter's Problem (高斯消元)

    There is a square wall which is made of n*n small square bricks. Some bricks are white while some br ...