迷宫程序实际上是图的遍历的应用,只是在本例中迷宫的每个入口都是只有4个方向(上下左右),而在图中每个顶点可以有任意个邻接顶点,邻接顶点之间也可以有回环。在遍历时可以使用递归调用(占用系统栈空间),也可以在遍历过程中把信息存入自己建立的容器(栈适合于深度优先遍历, 后进先出的特点);从一个顶点v到他的未访问的邻接顶点有多个路径,既然深入下去一条,就需要记住其他几条路径(也就是v的其他未访问的邻接顶点),或者至少记住未访问的路径的所有公共顶点(也即v),这种会节省栈空间,但是略麻烦,需要重新寻找v的all adjacent vertex,如果graph存储为martrix,总体需要查找时间为O(V平方),如果为adjacent list结构总体需要O(E)。

在这个maze例子中就是用DFS深度优先遍历,直到找出出口。

边界border用1表示,通路用0表示,入口用m表示,出口用e表示,访问过标志用,表示。

#pragma once
#include <iostream>
#include <string>
#include <stack>
using namespace std;template<class T>
class Stack : public stack<T>
{
public:T pop(){T tmp = top();stack<T>::pop();return tmp;}
};class Cell
{friend class Maze;
public:Cell(int i = 0, int j = 0) : x(i), y(j) {  }bool operator==(const Cell &c) const{return x == c.x && y == c.y;}
private:int x, y;
};class Maze {
public:Maze();void exitMaze();
private:Cell currentCell, exitCell, entryCell;const char exitMarker, entryMarker, visited, passage, wall;Stack<Cell> mazeStack;char **store;         // array of strings;void pushUnvisited(int, int);int rows, cols;friend ostream& operator<< (ostream& out, const Maze& maze) {for (int row = 0; row <= maze.rows + 1; row++)out << maze.store[row] << endl;out << endl;return out;}
};Maze::Maze() : exitMarker('e'), entryMarker('m'), visited(','),
passage('0'), wall('1') {char str[80], *s;int col, row = 0;Stack<char*> mazeRows;cout << "Enter a rectangular maze using the following "<< "characters:\nm - entry\ne - exit\n1 - wall\n 0 - passage"<< "\nEnter one line at a time, end with ctrl-z:\n";while (cin >> str) {row++;cols = strlen(str);s = new char[cols + 3]; // two borders and a \0mazeRows.push(s);strcpy(s + 1, str);s[0] = s[cols + 1] = wall;s[cols + 2] = '\0';if (strchr(s, exitMarker) != nullptr)exitCell = Cell(row, strchr(s, exitMarker) - s);if (strchr(s, entryMarker) != nullptr)entryCell = Cell(row, strchr(s, entryMarker) - s);}rows = row;store = new char*[rows + 2];    // add up and bottem borderstore[0] = new char[cols + 3];store[rows + 1] = new char[cols + 3];while (!mazeRows.empty())store[row--] = mazeRows.pop();store[0][cols + 2] = store[rows + 1][cols + 2] = '\0';for (col = 0; col <= cols + 1; ++col) {store[0][col] = wall;         // fill the borderline rows with 1s;store[rows + 1][col] = wall;}
}void Maze::pushUnvisited(int row, int col)
{if (store[row][col] == passage || store[row][col] == exitMarker)mazeStack.push(Cell(row, col));
}void Maze::exitMaze()
{int row, col;currentCell = entryCell;while (!(currentCell == exitCell)) {row = currentCell.x;col = currentCell.y;cout << *this;if (!(currentCell == entryCell))store[row][col] = visited;pushUnvisited(row - 1, col);pushUnvisited(row + 1, col);pushUnvisited(row, col - 1);pushUnvisited(row, col + 1);// 栈为空,说明已经没有可以试的路径了if (mazeStack.empty()) {cout << *this;cout << "Falure.\n";return;}elsecurrentCell = mazeStack.pop();}cout << *this;cout << "Success.\n";
}int main()
{Maze maze;maze.exitMaze();return 0;
}

maze走迷宫-C++相关推荐

  1. 迷宫python_Python走迷宫,递归 - nixBlog

    递归走迷宫,练手. 23下午就写好的,可是测试几种不同的迷宫后,发现有个Bug,我以为算法有问题,今早才发现,原来是isDest函数里r和c都写成r了,拷贝out函数的语句再改写造成的悲剧. #!/u ...

  2. java课程设计总结迷宫_Java课程设计走迷宫详解.doc

    Java语言与面向对象技术 课程设计报告 ( 2014 -- 2015年度第 1 学期) 走迷宫 目 录 目 录2 1 概 述1 1.1 课程设计目的1 1.2 课程设计内容1 2 系统需求分析2 2 ...

  3. 520,花一夜给女神写走迷宫游戏

    以前虽然写过走迷宫,很多人反映没找到代码不会部署,没看明白原理,这次把更详细写出优化并将代码放到github,趁着520可以自己放一些图片献给女神! 起因 先看效果图(文末有动态图)(在线电脑尝试地址 ...

  4. 学习笔记6-小项目-走迷宫、推箱子

    获取方向键的功能:使用getch.h头文件中的getch函数 1.把windows中的getch.h头文件放到共享文件夹中 2.终端输入 cd /media/sf_GONGXIANG进入共享文件夹 3 ...

  5. 老鼠走迷宫php算法,C语言经典算法 - 老鼠走迷官(一)

    C语言经典算法 - 老鼠走迷官(一) 说明老鼠走迷宫是递回求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁,使用1来表 示老鼠的行走路径,试以程式求出由入口至出口的路径. 解法老鼠的走法有上.左.下 ...

  6. java递归老鼠走迷宫_递归算法求老鼠走迷宫(C语言)

    /*说明老鼠走迷宫是递回求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁, 使用1来表示老鼠的行走路径,试以程式求出由入口至出口的路径. 解法老鼠的走法有上.左.下.右四个方向,在每前进一格之后就选 ...

  7. 有关迷宫的c语言程序的编写,3种C语言编写走迷宫的方法

    曾经听说过一个走迷宫的诀窍:顺着墙沿一侧走. (一直沿左侧或一直沿右侧).本程序实现了这一 思想,小人一直沿左侧走. 迷宫是随机生成的. 开始时,按数字 1 键进入人工控制模式:按w,s, a,d分别 ...

  8. 广度优先算法_算法浅谈——走迷宫问题与广度优先搜索

    本文始发于个人公众号:TechFlow,原创不易,求个关注 在之前周末LeetCode专栏当中,我们详细描述了深度优先搜索和回溯法,所以今天我们继续这个话题,来和大家聊聊搜索算法的另一个分支,广度优先 ...

  9. Java B组蓝桥杯第十届国赛:大胖子走迷宫

    试题 H: 大胖子走迷宫 时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分 [问题描述] 小明是个大胖子,或者说是个大大胖子,如果说正常人占用 1 × 1 的面积, 小明要占用 5 ...

  10. 用Q-learning算法实现自动走迷宫机器人

    项目描述: 在该项目中,你将使用强化学习算法,实现一个自动走迷宫机器人. 如上图所示,智能机器人显示在右上角.在我们的迷宫中,有陷阱(红色炸弹)及终点(蓝色的目标点)两种情景.机器人要尽量避开陷阱.尽 ...

最新文章

  1. 计算机二级c语言程序,二级C语言考试系统
  2. Angular2+ 结构型指令
  3. FTP命令行使用精粹
  4. 两张趣图助你理解 HTTP 状态码
  5. 多特征自动植物病害识别与检测
  6. 怎样取消计算机中镜像,win7系统,如何删除之前创建的镜像文件。 (不是在系统保护里头删除还原点,我试过了)...
  7. VMware vSphere client 5.1登录出现这个错误:客户端无法向服务器发送完整请求
  8. find 命令_教你Linux find命令实例教程:15个find命令用法
  9. GPS原理与接收机————GPS信号及其导航电文
  10. 中国手机市场调查报告
  11. 1044: 不及格率 C语言
  12. Android Studio连接手机教程
  13. jboss不打印日志的问题------:logback + slf4j + jboss + spring mvc----菩提树下的杨过
  14. alisoft 开放旺旺SDK,我也来凑合一下
  15. 【python实战】不玩微博,一封邮件就能知道实时热榜,天秀吃瓜
  16. 使用for语句时的注意事项
  17. 图片按钮+自定义形状
  18. MyCat (一) --------- MyCat 概述
  19. 3D点云基础知识(一)-初始入门-知乎整理(一)
  20. windows操作系统当中常用的DOS命令

热门文章

  1. 人工智能数学基础9:集合相关概念
  2. 数据交易,距离生产要素市场化还有多远? | 2022全球数字价值峰会
  3. 十分钟用Django创建一个简单的职位管理系统
  4. activeMQ初识到使用(二)
  5. Linux查看系统自启动服务
  6. VScode 光标乱跳 光标自动跳动问题
  7. 路飞学城python开发ftp_路飞学城-Python开发集训-第1章
  8. gmail邮箱注册成功流程
  9. 用windows电脑制作macos系统安装U盘
  10. 消控中心人员配置_消控室的设置要求有哪些?