题目:

  给一个迷宫,求出从起点到终点的路径。迷宫 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. JAVA 根据用户输入数据求某年到某年有多少天

    实例: import java.util.*; //求某年到某年有多少天 public class Test{ public static void main(String[] args){ Scan ...

  2. IronPython 设置包路径

    C#中添加对python文件或者对python包的引用时出现"no module .."的问题时的解决办法. 对hello.py 做一些简单的修改 添加 import syssys ...

  3. redis在windows上的安装

    1.下载地址:https://github.com/MSOpenTech/redis 主要支持win64的,有个msi文件可以直接安装,安装后redis会变成一个服务,对于windows来说这种最方便 ...

  4. [ActionScript 3.0] 跨域策略文件crossdomain.xml配置详解

    1.简介 flash在跨域时唯一的限制策略就是crossdomain.xml文件,该文件限制了flash是否可以跨域读写数据以及允许从什么地方跨域读写数据. 位于www.a.com域中的SWF文件要访 ...

  5. JAVA中关于同步与死锁的问题

    java中当多个现成同时操纵同一资源的时候需要考虑同步的问题.如车站售票,不同售票点卖同一班次车票的时候就要同步,否则卖票会有问题.下面代码模拟车站卖票: class TicketSeller imp ...

  6. Gradle简介

    gradle跟ant/maven一样,是一种依赖管理/自动化构建工具.但是跟ant/maven不一样,它并没有使用xml语言,而是采用了Groovy语言,这使得它更加简洁.灵活,更加强大的是,grad ...

  7. 硬盘安装ubuntu120.04分区方案

    320G分区方案1/boot :256MB ext2swap :4G/ :40G ext4/tmp :5G ext4/var :20G ext4/usr :20G ext4/home :230GMB ...

  8. 动态代理实现AOP【转】

    http://blog.csdn.net/beijiguangyong/article/details/8624016 根据前面介绍的Proxy和InvocationHandler,实在很难看出这种动 ...

  9. IIS错误代码表

    当用户试图通过 HTTP 或文件传输协议 (FTP) 访问一台正在运行 Internet 信息服务 (IIS) 的服务器上的内容时,IIS 返回一个表示该请求的状态的数字代码.该状态代码记录在 IIS ...

  10. 检测网页是否可以打开, 再使用IE打开网页

    //检测是否能连接网页 BOOL CanLinkWebPage(string strUrl) { /*clock_t start, finish; double duration; start = c ...