当前位置:首页 > 通信资讯 > 正文

迷宫问题递归(c语言走迷宫程序递归)

本文实例为大家分享了C++利用递归实现走迷宫的具体代码,供大家参考,具体内容如下

要求:

1、将地图的数组保存在文件中,从文件中读取行列数

2.、动态开辟空间保存地图

3.、运行结束后再地图上标出具体的走法

说明:

1、文件中第一行分别放置的是地图的行数和列数

2、其中1表示墙,即路不通,0表示路,即通路

3、程序运行结束后用2标记走过的路径

4、当走到“死胡同”时用3标记此路为死路

5、每到一个点,按照 左 上 右 下 的顺序去试探

6、没有处理入口就是"死胡同"的极端情况

maze.h

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 #ifndef _MAZE_H_ #define _MAZE_H_ #include <fstream> // ifstream #include <iostream> #include <cassert> #include <string> using namespace std; // 坐标类 class Seat { public: Seat(int _x, int _y) :x(_x) ,y(_y) { } int x; int y; }; // 迷宫类 class Maze { private: int** _map; // 指向地图的指针 int _row; // 存放地图的行数 int _col; // 存放地图的列数 public: // 构造函数 读取文件里的地图 和行数 Maze(const string& filePath); private: // 判断是否是路 bool IsPass(Seat& entry); public: // 开始走 bool PassMaze( Seat& entry); // 打印地图 void PrintMap(); // 析构 释放空间 ~Maze(); }; #endif

maze.cpp

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 // 递归实现迷宫 #include "maze.h" // 判断是否是路 bool Maze::IsPass( Seat& Entry) { if (_map[Entry.x][Entry.y] == 0) { return true; } return false; } // 构造函数 读取文件里的地图 和行数 Maze::Maze(const string& filePath ) { ifstream read(filePath); string str_row_col, str_temp; // 读取第一行 getline(read, str_row_col); // 获取行 str_temp = str_row_col.substr(0, str_row_col.find_first_of(',')); _row = atoi(str_temp.c_str()); // 获取列 str_temp = str_row_col.substr( str_row_col.find_first_of(',')+1); _col = atoi(str_temp.c_str()); // 为地图分配空间 _map = new int*[_row]; for (int index = 0; index < _col; ++index) { _map[index] = new int[_col]; } int index_col = 0; int index_row = 0; // 填充地图 while (!read.eof()) { // 获取一行 getline(read, str_temp); char * line = (char*)str_temp.c_str(); while ((*line) != '\0') { if (*line == '0' || *line == '1') { _map[index_row][index_col++] = *line - '0'; } ++line; } ++index_row; index_col = 0; } // 关闭文件 read.close(); } // 开始走 bool Maze::PassMaze( Seat& Entry) { // 判断是否走到出口 if (Entry.x < 0 || Entry.y < 0 || Entry.y >=_row) { return true; } if (IsPass(Entry)) { // 将走过的路置为2 _map[Entry.x][Entry.y] = 2; // 向左走 Seat left(Entry.x, Entry.y-1); if (PassMaze(left))// 递归调用 { return true; } // 向上走 Seat up(Entry.x-1, Entry.y); if (PassMaze(up)) // 递归调用 { return true; } // 向右走 Seat right(Entry.x, Entry.y+1); if (PassMaze(right)) // 递归调用 { return true; } // 向下走 Seat down(Entry.x+1, Entry.y); if (PassMaze(down)) { return true; } // 走到此处说明是死路 置为3 _map[Entry.x][Entry.y] = 3; } return false; } // 打印地图 void Maze::PrintMap() { for (int row = 0; row<_row; ++row) { for (int col = 0; col<_col; ++col) { cout << _map[row][col] << " "; } cout <<endl; } cout <<endl; } // 释放空间 Maze::~Maze() { for (int idx = 0; idx < _row; ++idx ) { delete[] _map[idx]; } delete[] _map; _map = NULL; }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/a1414345/article/details/53861500

如果您对该产品感兴趣,请填写办理(客服微信:xiaoxiongyidong)

为您推荐:

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。