题目:

  给一个迷宫,求出从起点到终点的路径。迷宫 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. gerrit 使用笔记

    添加git hooks git库的钩子目录中有一个commit-msg脚本文件,可以在git执行commit时,在提交信息中自动添加一个唯一的Change-Id scp -P 29419 admin@ ...

  2. ios6和ios7禁止屏幕旋转

    ios6和ios7禁止屏幕旋转 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOr ...

  3. Windows 32 程序设计

    C语言版 开发语言:C语言 开发工具:Visual Studio 2015 目      标:使用C语言,直接调用Windows API,创建Windows程序. 参考图书:<Windows程序 ...

  4. ruby4种比较符号

    The == comparison checks whether two values are equal eql? checks if two values are equal and of the ...

  5. 中文系统下,UTF-8编码文本文件读取导致的错误

    一.UTF-8编码文件读取导致的错误 有个txt文件,里面内容为: aaa bbb ccc 以UTF-8编码方式打开txt文件,顺序读取,将里面的值放到一个hashset中,并判断aaa是否在在has ...

  6. NYOJ 52-无聊的小明

    点击打开链接 无聊的小明 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述       这天小明十分无聊,没有事做,但不甘于无聊的小明聪明的想到一个解决无聊的办法,因为他突 ...

  7. RequireJS API

    可以找到许多的解读,但是原文总是最重要的,也是最正宗的说明,直接访问 RequireJS 有时不太方便,这里将 RequireJS 2.0 API 的原文转载到博客园,方便查看. This is th ...

  8. 翻译「C++ Rvalue References Explained」C++右值引用详解 Part8:Perfect Forwarding(完美转发):解决方案

    本文为第八部分,目录请参阅概述部分:http://www.cnblogs.com/harrywong/p/cpp-rvalue-references-explained-introduction.ht ...

  9. LibreOffice源码编译以及生成VS项目

    最权威的社区链接:https://wiki.documentfoundation.org/Development/BuildingOnWindows 也许英文好的人直接看wiki上的说明就能很容易的编 ...

  10. (二). 细说Kalman滤波:The Kalman Filter

    本文为原创文章,转载请注明出处,http://www.cnblogs.com/ycwang16/p/5999034.html 前面介绍了Bayes滤波方法,我们接下来详细说说Kalman滤波器.虽然K ...