(图 BFS)走迷宫
题目:
给一个迷宫,求出从起点到终点的路径。迷宫 src.txt 文件内容如下,第一行是迷宫的行列数,后面行是迷宫,1表示可行走,0表示不可以通过,起点是最左上角,终点是最右下角:
解析:
其实就是图的广度优先遍历。
代码及运行结果:
#include <iostream>
#include <queue>
#include <fstream>
#include <string>
#include <iomanip> using std::cout;
using std::endl;
using std::cin;
using std::string; class Maze
{
public:
Maze(string file);
~Maze();
void showMaze(void) const;
void getPath(void);
void calc(void);
void showPreNode(void) const;
void showPath(void) const; private:
int m_rows;
int m_colomns;
bool** m_pData; //用bool装迷宫数据 int** m_preNode; //记录路径,也就是前一个节点
bool** m_flag; //标志是否访问过
enum { INVALID = - }; struct Coord //定义一个坐标
{
int x;
int y; bool operator ==(const Coord& rhs)
{
if (this->x == rhs.x && this->y == rhs.y)
return true;
return false;
}
}; void initeAboutCalc(void);
Coord getAssignCoord(const Coord& thisCoord, int num) const;
void showPathPre(int x, int y) const;
}; Maze::Maze(string file)
{
std::ifstream fin(file);
fin >> m_rows >> m_colomns; //分配数据区
m_pData = new bool*[m_rows];
for (int i = ; i < m_rows; i++)
m_pData[i] = new bool[m_colomns]; //读取数据
for (int i = ; i < m_rows; i++)
{
for (int j = ; j < m_colomns; j++)
fin >> m_pData[i][j];
} //初始化其他
initeAboutCalc();
} void Maze::initeAboutCalc(void)
{
m_preNode = new int*[m_rows];
m_flag = new bool*[m_rows]; for (int i = ; i < m_rows; i++)
{
m_preNode[i] = new int[m_colomns];
memset(m_preNode[i], INVALID, m_colomns * sizeof(int)); m_flag[i] = new bool[m_colomns];
memset(m_flag[i], false, m_colomns * sizeof(bool));
}
} Maze::~Maze()
{
for (int i = ; i < m_rows; i++)
delete[] m_pData[i]; delete[] m_pData;
} void Maze::showMaze(void) const
{
for (int i = ; i < m_rows; i++)
{
for (int j = ; j < m_colomns; j++)
cout << m_pData[i][j] << " "; cout << endl;
}
} void Maze::calc(void)
{
const Coord START = { , };
const Coord END = { m_rows - , m_colomns - };
const Coord ERROR_COORD = { -, - }; std::queue<Coord> que; //二维数组下标放到队列里面去
m_flag[START.x][START.y] = true;
que.push(START); //起点 while (true)
{
Coord thisNode = que.front();
que.pop();
if (thisNode == END)
break; //对于这一点的上下左右个点
for (int i = ; i < ; i++)
{
Coord coordTemp = getAssignCoord(thisNode, i);
if (coordTemp == ERROR_COORD || == m_pData[coordTemp.x][coordTemp.y]) //没有这点或者这点是墙
continue; if (!m_flag[coordTemp.x][coordTemp.y]) //没有访问过
{
m_flag[coordTemp.x][coordTemp.y] = true;
m_preNode[coordTemp.x][coordTemp.y] = thisNode.x * m_colomns + thisNode.y; //注意这里用的不是坐标了,但也可唯一确定一个点
que.push(coordTemp);
}
}
}
} Maze::Coord Maze::getAssignCoord(const Coord& thisCoord, int num) const
{
Coord res = { -, - }; //不合法的
if (num < || num >= )
return res; switch (num)
{
case :
{
if (!thisCoord.x)
return res;
res.x = thisCoord.x - ;
res.y = thisCoord.y;
}
case :
{
if (thisCoord.y == m_colomns - )
return res;
res.x = thisCoord.x;
res.y = thisCoord.y +;
}
case :
{
if (thisCoord.x == m_rows - )
return res;
res.x = thisCoord.x + ;
res.y = thisCoord.y;
}
case :
{
if (!thisCoord.y)
return res;
res.x = thisCoord.x;
res.y = thisCoord.y - ;
}
}
return res;
} void Maze::showPreNode(void) const
{
for (int i = ; i < m_rows; i++)
{
for (int j = ; j < m_colomns; j++)
cout << std::setw() << std::left << m_preNode[i][j]; cout << endl;
}
} void Maze::showPath(void) const
{
showPathPre(m_rows - , m_colomns - );
} void Maze::showPathPre(int x, int y) const
{
if ( == x && == y)
{
cout << "(" << x << ", " << y << ")" << endl;
}
else
{
showPathPre(m_preNode[x][y] / m_colomns, m_preNode[x][y] % m_colomns);
cout << " -> (" << x << ", " << y << ")" << endl;
}
} int main(void)
{
Maze maze("src.txt");
maze.showMaze();
cout << endl;
maze.calc();
maze.showPreNode();
cout << endl;
maze.showPath();
cin.get();
}

(图 BFS)走迷宫的更多相关文章
- ACM:图BFS,迷宫
称号: 网络格迷宫n行m单位列格组成,每个单元格无论空间(使用1表示),无论是障碍(使用0为了表示).你的任务是找到一个动作序列最短的从开始到结束,其中UDLR同比分别增长.下一个.左.向右移动到下一 ...
- 一本通之 一堆迷宫 (Dungeon Master&走出迷宫&走迷宫)
一本通在线崩溃....... . 有图有真相 这是个三维迷宫,其实和二位迷宫差不多,只是方向多加了2个. 但这个题的输入十分恶心,一度被坑的用cin.ignore(),但还是不过... 它的正确输入方 ...
- HDU 2102 A计划(BFS/DFS走迷宫)
A计划 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- 【BZOJ2707】[SDOI2012]走迷宫 Tarjan+拓扑排序+高斯消元+期望
[BZOJ2707][SDOI2012]走迷宫 Description Morenan被困在了一个迷宫里.迷宫可以视为N个点M条边的有向图,其中Morenan处于起点S,迷宫的终点设为T.可惜的是,M ...
- Java基于OpenCV实现走迷宫(图片+路线展示)
Java基于OpenCV实现走迷宫(图片+路线展示) 由于疫情,待在家中,太过无聊.同学发了我张迷宫图片,让我走迷宫来缓解暴躁,于是乎就码了一个程序出来.特此记录. 原图: 这张图,由于不是非常清晰, ...
- BZOJ 2707: [SDOI2012]走迷宫( tarjan + 高斯消元 )
数据范围太大不能直接高斯消元, tarjan缩点然后按拓扑逆序对每个强连通分量高斯消元就可以了. E(u) = 1 + Σ E(v) / degree(u) 对拍时发现网上2个程序的INF判断和我不一 ...
- SDOI2012 走迷宫
走迷宫 Morenan被困在了一个迷宫里.迷宫可以视为N个点M条边的有向图,其中Morenan处于起点S,迷宫的终点设为T.可惜的是,Morenan非常的脑小,他只会从一个点出发随机沿着一条从该点出发 ...
- SDUT-2449_数据结构实验之栈与队列十:走迷宫
数据结构实验之栈与队列十:走迷宫 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个由n * m 个格子组成的迷宫,起 ...
- 数据结构之递归Demo(走迷宫)(八皇后)(汉诺塔)
递归 顾名思义,递归就是递归就是递归就是递归就是递归......就是递归 Google递归:
- 百炼3752:走迷宫--栈实现dfs
3752:走迷宫 总时间限制: 1000ms 内存限制: 65536kB 描述 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走.给定一个迷宫,求从左上角走到右下角最 ...
随机推荐
- JAVA 方法重载
方法的重载是指:一个类中可以定义有相同的名字,但参数不同的多个方法,调用时会根据不同的参数列表选择对应的方法. 实例: W.java public class W{ public void F(Str ...
- java反射生成ORM
package com.wzh.jdbc; import java.lang.reflect.Field;import java.sql.Connection;import java.sql.Prep ...
- delphi 程序全屏显示无标题栏,覆盖整个屏幕
delphi 程序全屏显示无标题栏,覆盖整个屏幕,这个在做工控机或屏保时有用的,所以记下 procedure TMainFrm.FormCreate(Sender: TObject); begin w ...
- inno setup 在卸载时如果想保留文件 使用uninsneveruninstall
一般来说,inno只卸载你安装的文件,自动生成如Thumb.db(缩略图)等文件,卸载程序是不会删除这些的,此时你希望整个安装目录删除则可用你说的方法删除.若想保留某些文件,则必须在[File]段中拷 ...
- MongoDB 语法使用小结
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的 他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据 ...
- Spring Data Jpa真爽啊
http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-jpa/ 持久层的实现类可以让框架生成.只需要声明持久层接口,框架直接生成代理 ...
- IOS开发-jqeurey mobile
有一阵子没写东西了,最近打算重新拾起开发,做点手机上的东东,选中了phonegap.jquery mobile,phonegap的部署网上非常多,有空了再班门弄斧,这里先记下jquery mobile ...
- 用imageNamed加载图片产生的问题
通常我们会用imageNamed:来加载图片,但是用这个API有个问题,就是它会缓存加载的image. 因此,对于那些被重用的图片,这个API很高效.但是对于那些使用很少的图片,用这个就很耗内存,那怎 ...
- 内省—beanutils工具包
Apache组织开发了一套用于操作JavaBean的API,这套API考虑到了很多实际开发中的应用场景,因此在实际开发中很多程序员使用这套API操作JavaBean,以简化程序代码的编写. BeanU ...
- Flex4/Flash开发在线音乐播放器 , 含演示地址
要求 必备知识 本文要求基本了解 Adobe Flex编程知识和JAVA基础知识. 开发环境 MyEclipse10/Flash Builder4.6/Flash Player11及以上 演示地址 演 ...