《数据结构》(C语言版) 严蔚敏 迷宫求解(栈)

 

#include <iostream>
#include <stack>
#include <string.h>
#include <windows.h>
#define M 10
#define N 10
using namespace std;
struct WAY
{
	int x,y,direction;
}; //位置坐标及其方向
stack<WAY> way; //定义栈
int a[4][2]={{-1,0},{1,0},{0,-1},{0,1}};//对应上下左右四种操作 
int Map[M][N]={{1,1,1,1,1,1,1,1,1,1},   //地图,1代表墙,0代表通道 
               {1,0,0,1,0,0,0,1,0,1},
               {1,0,0,1,0,0,0,1,0,1},
               {1,0,0,0,0,1,1,0,0,1},
               {1,0,1,1,1,0,0,0,0,1},
               {1,0,0,0,1,0,0,0,0,1},
               {1,0,1,0,0,0,1,0,0,1},
               {1,0,1,1,1,0,1,1,0,1},
               {1,1,0,0,0,0,0,0,0,1},
               {1,1,1,1,1,1,1,1,1,1}
};
int visit[M][N];  //记录是否已经走过 

bool check(const struct WAY &w)
{
	return (w.x>0&w.x<9&&w.y>0&&w.y<9);
}

void DrawMap()//画地图 
{
	for(int i=0;i<M;i++)
	{
		for(int j=0;j<N;j++)
		{
			if(Map[i][j]==0&&visit[i][j]==1) cout<<"★"; //能够通过的点 
			else if(Map[i][j]==1) cout<<"■"; //墙 
			else if(Map[i][j]==0&&visit[i][j]==2) cout<<"×"; //死角 
			else cout<<"□"; //空白 
		}
		cout<<endl;
	}
}

bool dfs()
{
	struct WAY start,current;
	start.x=1;start.y=1;start.direction=0;//迷宫入口 
	current=start;
	do
	{
		DrawMap();  //画图 
		if(!visit[current.x][current.y]&&!Map[current.x][current.y]&&check(current))//判断条件:未走过,不为墙,不越过边界则入栈 
		{
			way.push(current); 
			visit[current.x][current.y]=1;
			if(current.x==8&&current.y==8) return true; //当到达迷宫终点时返回真 
			current.x=current.x+a[0][0];current.y=current.y+a[0][1]; //默认先向上探索 
		}
		else 
		{
			if(!way.empty()) //当前位置不能通过时 
			{
				struct WAY temp=way.top(); //保存当前位置 
				way.pop();                 //弹出当前位置 
				while(temp.direction==3&&!way.empty()) //四个方向均探索后说明该位置无法通过,为死角 
				{
					visit[temp.x][temp.y]=2;  //将该点特殊标记,方便区分 
					temp=way.top();           //再奖栈顶弹出,若也为死角则继续弹出 
					way.pop();
				}
				if(temp.direction<3)          //向其他方向进行探索     
				{
					temp.direction++;
					way.push(temp);
					current.x=temp.x+a[temp.direction][0];current.y=temp.y+a[temp.direction][1];
				}
			}
		}
		Sleep(500);  //延时 
		system("cls");  //清屏 
	}while(!way.empty());
	return false;
} 

int main()
{
	memset(visit,0,sizeof(visit));
	if(dfs())	cout<<"路线已找到"<<endl;
	else cout<<"无法找到路线"<<endl; 
	return 0;
}

PS:在以上代码中只能找到一条通往出口的路线,且并不为最短路线,故仍需要继续改进,将在以后继续更新,也希望大家能多多指点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值