本文实例为大家分享了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
|
#ifndef _MAZE_H_
#define _MAZE_H_
#include <stack>
#include <fstream> // ifstream
#include <iostream>
#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(stack<Seat>& s, 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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
// 迷宫之递归实现
#include "maze.h"
// 构造函数
Maze::Maze( const string& filePath)
{
ifstream mapFile(filePath, ofstream::out);
assert (mapFile); // 断言文件是否存在
string str_row_col; //第一行 获取行和列
string str_temp; // 临时字符串
// 获取行列的个数
getline(mapFile,str_row_col); // 读取第一行
str_temp = str_row_col.substr(0, str_row_col.find_first_of( ',' )); // 取得字符串中的字串获取行数
_row = atoi (str_temp.c_str()); // atoi将字符串转为数字
str_temp = str_row_col.substr(str_row_col.find_first_of( ',' )+1); // 取得字符串中的列数
_col = atoi (str_temp.c_str()); // atoi将字符串转为数字
// 分配空间
_map = new int *[_row];
for ( int idx = 0; idx < _col; ++idx)
{
_map[idx] = new int [_col];
}
// 填充地图
int index_row = 0; // 放置地图 二维数组的行索引
int index_col = 0; // 放置地图 二维数组的列索引
while (!mapFile.eof())
{
getline(mapFile, str_temp);
char * a_line = ( char *)str_temp.c_str();
// 遍历一行
while (*a_line != '\\0' )
{
if (*a_line == '0' || *a_line == '1' )
{
_map[index_row][index_col++] = *a_line - '0' ; // 减0 是将字符'0'的 ASCII对应的十进制值减去
}
a_line++; // 向后移动指针
}
++index_row;
index_col = 0; // 每处理完一行后将列索引置0
}
mapFile.close();
}
// 判断是否是路
bool Maze::IsPass(Seat& entry)
{
if (entry.x < 0 || entry.y < 0 || entry.y >= _col || entry.x >= _row)
{
return true ;
}
if (_map[entry.x][entry.y] == 0)
{
return true ;
}
return false ;
}
// 开始走
void Maze::PassMaze( Seat& entry)
{
stack<Seat> s;
if (IsPass(entry))
{
s.push(entry); // 压栈当前位置
while (!s.empty()) // 栈不为空继续
{
Seat curSeat = s.top(); // 取得栈顶存储的位置
// 走到边界
if (curSeat.x < 0 || curSeat.y < 0 || entry.y >= _col || entry.x >= _row )
{
return ;
}
_map[curSeat.x][curSeat.y] = 2; // 将走过的路标记为2
// 往左走
Seat left(curSeat.x, curSeat.y-1);
if (IsPass(left))
{
s.push(left);
continue ;
}
// 往上走
Seat up(curSeat.x-1, curSeat.y);
if (IsPass(up))
{
s.push(up);
continue ;
}
// 往右走
Seat right(curSeat.x, curSeat.y+1);
if (IsPass(right))
{
s.push(right);
continue ;
}
// 往下走
Seat down(curSeat.x+1, curSeat.y);
if (IsPass(down))
{
s.push(down);
continue ;
}
// 运行到此处说明 每个方向都没有路可走 是死路标记为3
_map[curSeat.x][curSeat.y] = 3;
// 出栈这个“死路位置”
s.pop();
}
}
}
// 打印地图
void Maze::PrintMap()
{
for ( int index_row = 0; index_row < _row; ++index_row)
{
for ( int index_col = 0; index_col < _col; ++index_col)
{
cout << _map[index_row][index_col] << " " ;
}
cout <<endl;
}
cout <<endl;
}
// 析构
Maze::~Maze()
{
for ( int idx = 0; idx < _row; ++idx )
{
delete [] _map[idx];
}
delete [] _map;
_map = NULL;
}
test.cpp
[cpp] view plain copy
int main()
{
Maze m1( "map.txt" ); // 构造一个迷宫对象
m1.PrintMap(); // 走之前打印
m1.PassMaze(Seat(9, 4)); //开始走 传递迷宫入口点
m1.PrintMap(); // 结束后再次打印
return 0;
}
|
截图:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。
相关文章
猜你喜欢
- ASP.NET本地开发时常见的配置错误及解决方法? 2025-06-10
- ASP.NET自助建站系统的数据库备份与恢复操作指南 2025-06-10
- 个人网站服务器域名解析设置指南:从购买到绑定全流程 2025-06-10
- 个人网站搭建:如何挑选具有弹性扩展能力的服务器? 2025-06-10
- 个人服务器网站搭建:如何选择适合自己的建站程序或框架? 2025-06-10
TA的动态
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
您的支持,是我们最大的动力!
热门文章
-
2025-05-29 80
-
2025-05-27 40
-
2025-06-04 14
-
2025-06-04 34
-
2025-05-29 29
热门评论