题目:

  给一个迷宫,求出从起点到终点的路径。迷宫 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)走迷宫的更多相关文章

  1. ACM:图BFS,迷宫

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

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

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

  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. BZOJ 2707: [SDOI2012]走迷宫( tarjan + 高斯消元 )

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

  7. SDOI2012 走迷宫

    走迷宫 Morenan被困在了一个迷宫里.迷宫可以视为N个点M条边的有向图,其中Morenan处于起点S,迷宫的终点设为T.可惜的是,Morenan非常的脑小,他只会从一个点出发随机沿着一条从该点出发 ...

  8. SDUT-2449_数据结构实验之栈与队列十:走迷宫

    数据结构实验之栈与队列十:走迷宫 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个由n * m 个格子组成的迷宫,起 ...

  9. 数据结构之递归Demo(走迷宫)(八皇后)(汉诺塔)

    递归 顾名思义,递归就是递归就是递归就是递归就是递归......就是递归 Google递归:

  10. 百炼3752:走迷宫--栈实现dfs

    3752:走迷宫 总时间限制:  1000ms 内存限制:  65536kB 描述 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走.给定一个迷宫,求从左上角走到右下角最 ...

随机推荐

  1. myBatis获取批量插入数据的主键id

    在myBatis中获取刚刚插入的数据的主键id是比较容易的 , 一般来说下面的一句话就可以搞定了 , 网上也有很多相关资料去查. @Options(useGeneratedKeys = true, k ...

  2. Beautiful Soup第三方爬虫插件

    什么是BeautifulSoup? Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖析树(parse tree). 它提供简单又常用的 ...

  3. [SQL]select scope_identity()传回插入相同范围之识别资料行中的最后一个识别值

    传回插入相同范围之识别资料行中的最后一个识别值.范围是一个模组:预存程序.触发程序.函数或批次.因此,如果两个陈述式在相同预存程序.函数或批次中,它们就在相同范围中. 语法: SCOPE_IDENTI ...

  4. AndroidManifest.xml 屏幕上下反转

    通常我们的应用只会设计成横屏或者竖屏,锁定横屏或竖屏的方法是在AndroidManifest.xml 文件中设定属性android:screenOrientation为"landscape& ...

  5. 【转】关系映射文件***.hbm.xml详解

    http://blog.sina.com.cn/s/blog_7ffb8dd5010144yo.html 附.Oracle使用标准.可变长度的内部格式来存储数字.这个内部格式精度可以高达38位. NU ...

  6. OC基础(5)

    #pragma mark指令 description方法 OC多文件开发介绍 *:first-child { margin-top: 0 !important; } body > *:last- ...

  7. document.styleSheets[0]是个啥

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. (转)Struts2返回JSON对象的方法总结

    转自:http://kingxss.iteye.com/blog/1622455 如果是作为客户端的HTTP+JSON接口工程,没有JSP等view视图的情况下,使用Jersery框架开发绝对是第一选 ...

  9. Android开发-API指南-系统权限

    System Permissions 英文原文:http://developer.android.com/guide/topics/security/permissions.html 采集日期:201 ...

  10. MyBatis框架

    MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的xml或者注解用于 ...