C++用栈实现构造迷宫及寻找一条路径

备注:图形界面使用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;
}

运行结果:

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值