备注:图形界面使用EazyX图形库
头文件和常量定义:
#include <graphics.h>
#include<iostream>
#include<stack>
#include <stdlib.h>//包含随机数
#define Row 20
#define Col 20
#define MaxSize 3
using namespace std;
定义一个类用于存放所走过的路径:
class Box{
public:
int i;
int j;
int di;
void print() {
cout << i << " " << j << " " << di << endl;
}
};
栈实现迷宫求解算法:
//栈实现迷宫求解算法
bool mgpath(int mg[][Col], int xi, int yi, int xe, int ye) {
stack<Box> Stack;
Box *box=new Box();
int i=0, j=0,find;
//将入口节点入栈
box->i = xi; box->j = yi; box->di = -1;
Stack.push(*box);//入栈操作
mg[xi][yi] = -1;//走过的位置设为-1
while (!Stack.empty()) {//当栈为空,表明所有路径走过后退栈过程把入口点退出了,表名迷宫通路无解
*box = Stack.top();//每次循环使box指向栈顶
if (box->i == xe && box->j == ye) {//如果栈顶元素为出口坐标,表明找到路径,输出路径
for (; !Stack.empty();) {//循环输出
*box = Stack.top();
int x1, x2, y1, y2;
int i=box->i, j=box->j;
x1 = i * 20; x2 = i * 20 + 20;
y1 = j * 20; y2 = j * 20 + 20;
setfillcolor(BLUE);//设置填充颜色
solidrectangle(x1, y1, x2, y2);
Stack.pop();//栈顶元素弹出
}
return true;//输出结果路径后返回true
}
find = 0;//初始化find=0,表示下一个路径未找到
while (box->di < 4 && find == 0) {//找下一个路径,
//box->print();
box->di++;//对应di每次进入此循环后+1,该值将一直被保持,记录了哪些方向已被探索过
switch (box->di) {
case 0: i = box->i - 1; j = box->j; break;//向左探索
case 1: i = box->i ; j = box->j+1; break;//向上
case 2: i = box->i + 1; j = box->j; break;//向右
case 3: i = box->i ; j = box->j-1; break;//向下
}
if (mg[i][j] == 0) {//如果该点可走
find = 1;//find置1,退出while循环
}
}
if (find == 1) {//如果找到下一跳
box=new Box;//创建一个新的Box
box->i = i;
box->j = j;
box->di = -1;//新位置还没开始探索
Stack.push(*box);//新位置进栈
mg[i][j] = -1;//走过的位置标为-1,避免重复走到该位置
}
else {//如果没有找到下一跳
//mg[box->i][box->j] = 0;//恢复地图,之前被改为了-1
Stack.pop();//弹出栈顶元素(回溯过程)
//*box = Stack.top();
}
}
return false;//迷宫无解返回false
}
主函数:
int main() {
initgraph(1000, 600);//初始化大小
setbkcolor(BLUE);//指定背景颜色
setfillcolor(RED);//设置填充颜色
//使用随机数构造迷宫
int mg[Row][Col];
//外围设为1
for (int i = 0; i < Row; i++) {
mg[i][0] = 1;
mg[i][Col - 1] = 1;
}
for (int i = 0; i < Col; i++) {
mg[0][i] = 1;
mg[Row - 1][i] = 1;
}
//设置迷宫内部
for (int i = 1; i < Row - 1; i++) {
for (int j = 1; j < Col - 1; j++) {
if (rand() % 4)//使用除4取余,选用2或3时迷宫基本无解
mg[i][j] = 0;
else
mg[i][j] = 1;
}
}
mg[1][1] = 0; mg[Row - 2][Col - 2] = 0;//设置入口和出口为0
//输出迷宫
for (int i = 0; i < Row; i++) {
for (int j = 0; j < Col; j++) {
int x1, x2, y1, y2;
x1 = i * 20; x2 = i * 20 + 20;
y1 = j * 20; y2 = j * 20 + 20;
if (mg[i][j] ==1) {
setfillcolor(RED);//设置填充颜色
solidrectangle(x1, y1, x2, y2);
}
else {
setfillcolor(BLACK);//设置填充颜色
solidrectangle(x1, y1, x2, y2);
}
}
cout << endl;
}
//调用求解函数函数
if (!mgpath(mg, 1, 1, Row - 2, Col - 2)) {
cout << "迷宫无解" << endl;
}
system("pause");
return 0;
}