题目:

一个网格迷宫由n行m列的单元格组成,每一个单元格要么是空地(用1表示),要么是障碍物(用0来表示)。你的任务是找一条从起点到终点的最短移动序列,当中UDLR分别表示往上、下、左、右移动到相邻单元格。不论什么时候都不能在障碍格中。也不能走到迷宫之外。起点和终点保证是空地。

分析:图的BFS。

#include <iostream>
#include <string>
#include <queue>
using namespace std; const int MAXN = 500;
int maze[MAXN][MAXN], vis[MAXN][MAXN], dist[MAXN][MAXN], fa[MAXN][MAXN], last_dir[MAXN][MAXN];
int n, m, xs, ys, xt, yt; int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
char name[] = "UDLR"; void print_path(int x, int y) { //以递归的方式打印路径
int fx = fa[x][y] / m;
int fy = fa[x][y] % m;
if(fx != x || fy != y) {
print_path(fx, fy);
putchar(name[last_dir[x][y]]);
}
} int dir[MAXN*MAXN];
void print_path2(int x, int y) { //以迭代的方式打印路径
int c = 0;
for(;;) {
int fx = fa[x][y] / m;
int fy = fa[x][y] % m;
if(fx == x && fy == y) break;
dir[c++] = last_dir[x][y];
x = fx;
y = fy;
}
while(c--) putchar(name[dir[c]]);
} queue<int> q;
void bfs(int x, int y) {
int u = x*m+y;
dist[x][y] = 0; //初始化自己到自己的距离就是0
fa[x][y] = u; //起点的父亲节点就是自己,方便后面的打印操作
vis[x][y] = 1;
q.push(u);
while(!q.empty()) {
u = q.front();
q.pop();
x = u/m;
y = u%m;
for(int d = 0; d < 4; ++d) {
int nx = x + dx[d];
int ny = y + dy[d];
if(nx >= 0 && nx < n && ny >= 0 && ny < m && maze[nx][ny] && !vis[nx][ny]) {
int v = nx * m + ny;
q.push(v);
vis[nx][ny] = 1;
dist[nx][ny] = dist[x][y] + 1; //走的步数+1
fa[nx][ny] = v; //记录父亲结点
last_dir[nx][ny] = d; //记录如今这个节点到父亲节点走的方向
}
}
}
} int main() {
cin >> n >> m >> xs >> ys >> xt >> yt;
for(int i = 0; i < n; ++i) {
for(int j = 0; j < m; ++j) {
cin >> maze[i][j];
}
}
memset(vis, 0, sizeof(vis));
bfs(xs, ys);
print_path(xt, yt);
cout << endl;
print_path2(xt, yt);
cout << endl;
return 0;
}

ACM:图的BFS,走迷宫的更多相关文章

  1. 一本通之 一堆迷宫 (Dungeon Master&走出迷宫&走迷宫)

    一本通在线崩溃....... . 有图有真相 这是个三维迷宫,其实和二位迷宫差不多,只是方向多加了2个. 但这个题的输入十分恶心,一度被坑的用cin.ignore(),但还是不过... 它的正确输入方 ...

  2. ACM:图BFS,迷宫

    称号: 网络格迷宫n行m单位列格组成,每个单元格无论空间(使用1表示),无论是障碍(使用0为了表示).你的任务是找到一个动作序列最短的从开始到结束,其中UDLR同比分别增长.下一个.左.向右移动到下一 ...

  3. HDU 2102 A计划(BFS/DFS走迷宫)

    A计划 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  4. 【BZOJ2707】[SDOI2012]走迷宫 Tarjan+拓扑排序+高斯消元+期望

    [BZOJ2707][SDOI2012]走迷宫 Description Morenan被困在了一个迷宫里.迷宫可以视为N个点M条边的有向图,其中Morenan处于起点S,迷宫的终点设为T.可惜的是,M ...

  5. Java基于OpenCV实现走迷宫(图片+路线展示)

    Java基于OpenCV实现走迷宫(图片+路线展示) 由于疫情,待在家中,太过无聊.同学发了我张迷宫图片,让我走迷宫来缓解暴躁,于是乎就码了一个程序出来.特此记录. 原图: 这张图,由于不是非常清晰, ...

  6. ACM/ICPC 之 BFS(离线)+康拓展开(TSH OJ-玩具(Toy))

    祝大家新年快乐,相信在新的一年里一定有我们自己的梦! 这是一个简化的魔板问题,只需输出步骤即可. 玩具(Toy) 描述 ZC神最擅长逻辑推理,一日,他给大家讲述起自己儿时的数字玩具. 该玩具酷似魔方, ...

  7. sdut 2449走迷宫【最简单的dfs应用】

    走迷宫 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_ 题目描述 一个由n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m) ...

  8. BZOJ 2707: [SDOI2012]走迷宫( tarjan + 高斯消元 )

    数据范围太大不能直接高斯消元, tarjan缩点然后按拓扑逆序对每个强连通分量高斯消元就可以了. E(u) = 1 + Σ E(v) / degree(u) 对拍时发现网上2个程序的INF判断和我不一 ...

  9. NYOJ306 走迷宫(dfs+二分搜索)

    题目描写叙述 http://acm.nyist.net/JudgeOnline/problem.php?pid=306 Dr.Kong设计的机器人卡多非常爱玩.它经常偷偷跑出实验室,在某个游乐场玩之不 ...

随机推荐

  1. Vue图片懒加载插件

    图片懒加载是一个很常用的功能,特别是一些电商平台,这对性能优化至关重要.今天就用vue来实现一个图片懒加载的插件. 这篇博客采用"三步走"战略--Vue.use().Vue.dir ...

  2. iOS 11开发教程(七)编写第一个iOS11代码Hello,World

    iOS 11开发教程(七)编写第一个iOS11代码Hello,World 代码就是用来实现某一特定的功能,而用计算机语言编写的命令序列的集合.现在就来通过代码在文本框中实现显示“Hello,World ...

  3. 一个UICollectionView自定义layout的实现

      #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @ ...

  4. 希尔排序之C++实现(高级版)

    希尔排序之C++实现(高级版) 一.源代码:ShellSortHigh.cpp /*希尔排序基本思想: 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组. 所有距离为d1的倍数的记录放在同 ...

  5. luoguP4492 [HAOI2018]苹果树 组合计数 + dp

    首先,每个二叉树对应着唯一的中序遍历,并且每个二叉树的概率是相同的 这十分的有用 考虑\(dp\)求解 令\(f_i\)表示\(i\)个节点的子树,根的深度为\(1\)时,所有点的期望深度之和(乘\( ...

  6. 友好的KVO

    更友好的KVO 前言 观察者模式是大家在开发过程中每个人都要使用的一种设计模式,在iOS的开发流程中,KVO则是这一开发模式的主要实践手段,观察一个属性,当属性值发生变化的就能能够拿到这个属性的新.老 ...

  7. Codeforces Round #350 (Div. 2) D1. Magic Powder - 1 二分

    D1. Magic Powder - 1 题目连接: http://www.codeforces.com/contest/670/problem/D1 Description This problem ...

  8. C#访问修饰符总结[转]

    http://blog.csdn.net/tjvictor/article/details/4293354 C#共有五种访问修饰符:public.private.protected.internal. ...

  9. POJ 1470 Closest Common Ancestors (LCA,离线Tarjan算法)

    Closest Common Ancestors Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 13372   Accept ...

  10. 在Powerdesigner中创建概念数据模型

    点击菜单“File”---->“New Model” 点击[OK]按钮后,将进入如下的画面 系统将出现一个工具栏如下,用于在设计面板中设计模型