BFS简单迷宫
常见迷宫:
输入迷宫 启点 终点 然后求最短路径 BFS例题
用dist[][]数组来记录 启点到每个点的最短路径
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std; const int maxsize = ;
const int INF = 0xfff3;
int m,n;
int d[][] = { {-, , , }, {, , , -} };
int dist[maxsize][maxsize];//书上方法 : 用dist[m][n]将最短路径储存起来 初始为INF表示无法到达
struct Pos
{
int x,y;
}st,ed;
char maze[maxsize][maxsize]; bool check(int x, int y)
{
if(x < || x >= m || y < || y >= n) return false;
if(maze[x][y] == '#' || dist[x][y] != INF) return false;//!=INF表示可达就已经走到过
return true;
}
int bfs()
{
for (int i = ; i < m; i++)
for (int j = ;j < n; j++)
dist[i][j] = INF;
queue<struct Pos> que;
que.push(st);
dist[st.x][st.y] = ;//自己到自己为0
while (!que.empty())
{
int nx, ny;
Pos node = que.front();
que.pop();
//ans ++;//这里出错 并不是 每次出队都是最短路径中的结点 调试可以发现
if(node.x == ed.x && node.y == ed.y) return dist[ed.x][ed.y];
for (int i = ; i < ; i++)
{
nx = node.x + d[][i];
ny = node.y + d[][i];
if (check(nx, ny))
{
Pos temp;
temp.x = nx;
temp.y = ny;//这里用pair更好 方便
dist[nx][ny] = dist[node.x][node.y] + ;
que.push(temp);
}
}
}
return -;
} int main()
{
ifstream cin("in.txt");
freopen("in.txt", "r", stdin);
scanf("%d%d", &m, &n);
getchar();
for (int i = ;i < m; i++)
{
gets(maze[i]);
}
for (int i = ; i < m; i++)
{
for (int j = ; j < n; j++)
{
if (maze[i][j] == 'S')
{
st.x = i;
st.y = j;
}
if (maze[i][j] == 'G')
{
ed.x = i;
ed.y = j;
}
}
}
int ans = bfs();
if (ans == -) cout << "no way" << endl;
else cout << ans << endl;
}
//对fill 和 memset 还需了解 是在不行就循环填充
//用dist记录最短路径 而不是每一次出队ans++
//时间复杂度 状态转移是四个方向 每个格至多访问一次 O(4*m*n)
BFS简单迷宫的更多相关文章
- BFS简单题套路_Codevs 1215 迷宫
BFS 简单题套路 1. 遇到迷宫之类的简单题,有什么行走方向的,先写下面的 声明 ; struct Status { int r, c; Status(, ) : r(r), c(c) {} // ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)
深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析
转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...
- BFS实现迷宫问题
BFS实现迷宫问题 问题描述,要求从起点走到终点,找出最短的距离,要避开障碍 输入描述,输入一个二维数组表示地图,其中等于10就是终点,等于-10就是起点,等于1就是障碍,等于0就是可以走的 代码: ...
- bfs简单题-poj2251
宽搜基础题 思路很简单,注意细节. 走过的节点一定要打上标记//tag数组 三维字符串输入一定要注意 #include <stdio.h> #include <iostream> ...
- 暑假集训(1)第八弹 -----简单迷宫(Poj3984)
Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, ...
- ACM:图BFS,迷宫
称号: 网络格迷宫n行m单位列格组成,每个单元格无论空间(使用1表示),无论是障碍(使用0为了表示).你的任务是找到一个动作序列最短的从开始到结束,其中UDLR同比分别增长.下一个.左.向右移动到下一 ...
- 广度优先搜索(BFS)——迷宫的最短路径
宽度优先搜索按照距开始状态由近到远的顺序进行搜索,因此可以很容易的用来求最短路径,最少操作之类问题的答案. 宽度优先搜索介绍(一篇不错的文章). 题目描述: 给定一个大小为N*M的迷宫.迷宫有通道和墙 ...
- 【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,0, }; 它表示一个迷 ...
随机推荐
- 221 Maximal Square 最大正方形
在一个由0和1组成的二维矩阵内,寻找只包含1的最大正方形,并返回其面积.例如,给出如下矩阵:1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0返回 4. 详见:https://l ...
- PHP(二)常用函数
数学函数 数组函数 字符串函数
- idea 2018 解决 双击shift 弹出 search everywhere 搜索框的方法
https://youtrack.jetbrains.com/issue/IDEA-161094
- Vue 路由知识三(过渡动画及路由钩子函数)
路由的过渡动画:让路由有过渡动画,需要在<router-view>标签的外部添加<transition>标签,标签还需要一个name属性. <transition nam ...
- vba,excel,网址提取名字与链接url
'宏操作 Sub 复制超级链接() '这里控制读取A列的第1到10行,你根据自已的要求修改一下起始和结束行数 ).Hyperlinks.Count > ).Value = Cells(a, ). ...
- laravel-admin常见错误处理
php artisan key:generate 新的laravle会有密钥不存在的问题,这时候我们执行这句话就可以生成秘钥了
- Oracle中如何插入特殊字符: &amp; 和 &#39; (多种解决方案)
Oracle中如何插入特殊字符:& 和 ' (多种解决方案)今天在导入一批数据到Oracle时,碰到了一个问题:Toad提示要给一个自定义变量AMP赋值,一开始我很纳闷,数据是一系列的Inse ...
- Xcode5真机调试
http://blog.csdn.net/u011332675/article/details/17397849 (真机调试详解) http://blog.sina.com.cn/s/blog_ ...
- 笔试算法题(57):基于堆的优先级队列实现和性能分析(Priority Queue based on Heap)
议题:基于堆的优先级队列(最大堆实现) 分析: 堆有序(Heap-Ordered):每个节点的键值大于等于该节点的所有孩子节点中的键值(如果有的话),而堆数据结构的所有节点都按照完全有序二叉树 排.当 ...
- spring的IOC的简单理解
之前看了一下源码,看的挺吃力,只能是慢慢看了. 简单说一下springIOC的我的理解,IOC也叫控制反转,可以有效的减低各个组件之间的耦合度 想象一下,如果不用IOC,那么系统里面会有大量的new ...