使用C++语言编写应该程序,要求使用队列实现随机生成一个迷宫;可输出所有路径,并可动态显示路径
时间: 2024-03-05 07:55:12 浏览: 65
好的,下面是一个使用C++语言和队列实现随机生成迷宫并输出所有路径的示例代码。这里使用了深度优先搜索算法来查找迷宫中的所有路径,并且使用了Windows API来实现动态显示路径。代码如下:
```c++
#include <iostream>
#include <Windows.h>
#include <queue>
#include <stack>
#include <ctime>
using namespace std;
// 迷宫的行数和列数
const int ROW = 20;
const int COL = 20;
// 迷宫的格子状态
const int WALL = 0;
const int ROAD = 1;
// 定义一个迷宫的类
class Maze {
public:
Maze();
void printMaze(); // 打印迷宫
void generateMaze(); // 生成迷宫
void findPath(); // 查找所有路径
void showPath(stack<COORD> path); // 显示路径
private:
int maze[ROW][COL]; // 存储迷宫的数组
bool visited[ROW][COL]; // 记录格子是否被访问过
COORD start; // 迷宫的起点
COORD end; // 迷宫的终点
stack<COORD> path; // 存储当前路径
queue<COORD> q; // 用于广度优先搜索的队列
};
// 构造函数,初始化迷宫和起点终点
Maze::Maze() {
memset(maze, WALL, sizeof(maze)); // 将迷宫全部设置为墙
srand((unsigned int)time(NULL)); // 初始化随机数种子
start.X = rand() % (COL - 2) + 1; // 随机生成起点
start.Y = rand() % (ROW - 2) + 1;
end.X = rand() % (COL - 2) + 1; // 随机生成终点
end.Y = rand() % (ROW - 2) + 1;
maze[start.Y][start.X] = ROAD; // 将起点和终点设置为路
maze[end.Y][end.X] = ROAD;
}
// 打印迷宫
void Maze::printMaze() {
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
if (maze[i][j] == WALL) {
cout << "# ";
}
else {
cout << " ";
}
}
cout << endl;
}
}
// 生成迷宫
void Maze::generateMaze() {
// 随机生成迷宫
for (int i = 1; i < ROW - 1; i++) {
for (int j = 1; j < COL - 1; j++) {
if (rand() % 2) {
maze[i][j] = ROAD;
}
}
}
maze[start.Y][start.X] = ROAD; // 将起点和终点设置为路
maze[end.Y][end.X] = ROAD;
// 设置起点和终点周围的墙
maze[start.Y - 1][start.X] = WALL;
maze[start.Y + 1][start.X] = WALL;
maze[start.Y][start.X - 1] = WALL;
maze[start.Y][start.X + 1] = WALL;
maze[end.Y - 1][end.X] = WALL;
maze[end.Y + 1][end.X] = WALL;
maze[end.Y][end.X - 1] = WALL;
maze[end.Y][end.X + 1] = WALL;
}
// 查找所有路径
void Maze::findPath() {
// 初始化visited数组
memset(visited, false, sizeof(visited));
// 将起点入队列
q.push(start);
visited[start.Y][start.X] = true;
// 开始广度优先搜索
while (!q.empty()) {
COORD cur = q.front();
q.pop();
// 如果当前格子是终点,说明找到了一条路径,将路径存储到栈中
if (cur.X == end.X && cur.Y == end.Y) {
path.push(cur);
showPath(path);
path.pop();
}
// 否则继续搜索四周的格子
else {
if (maze[cur.Y - 1][cur.X] == ROAD && !visited[cur.Y - 1][cur.X]) { // 上
q.push({ cur.X, cur.Y - 1 });
visited[cur.Y - 1][cur.X] = true;
}
if (maze[cur.Y + 1][cur.X] == ROAD && !visited[cur.Y + 1][cur.X]) { // 下
q.push({ cur.X, cur.Y + 1 });
visited[cur.Y + 1][cur.X] = true;
}
if (maze[cur.Y][cur.X - 1] == ROAD && !visited[cur.Y][cur.X - 1]) { // 左
q.push({ cur.X - 1, cur.Y });
visited[cur.Y][cur.X - 1] = true;
}
if (maze[cur.Y][cur.X + 1] == ROAD && !visited[cur.Y][cur.X + 1]) { // 右
q.push({ cur.X + 1, cur.Y });
visited[cur.Y][cur.X + 1] = true;
}
}
}
}
// 显示路径
void Maze::showPath(stack<COORD> path) {
// 清空控制台
system("cls");
// 打印迷宫
printMaze();
// 将路径存储到数组中
COORD p[ROW * COL];
int i = 0;
while (!path.empty()) {
p[i++] = path.top();
path.pop();
}
// 显示路径
for (int j = i - 1; j >= 0; j--) {
maze[p[j].Y][p[j].X] = 2; // 将路径设置为2
// 设置控制台光标位置
COORD pos = { p[j].X * 2, p[j].Y };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
cout << "* ";
// 暂停一段时间,以便观察路径
Sleep(100);
}
}
int main() {
Maze maze;
maze.generateMaze();
maze.printMaze();
maze.findPath();
return 0;
}
```
这里使用了Windows API中的SetConsoleCursorPosition函数来设置控制台光标位置,并使用了Sleep函数来暂停一段时间,以便观察路径。请注意,由于控制台的行宽和列宽不同,所以在打印迷宫时需要将列数乘以2来保证输出的迷宫不会变形。
阅读全文