C++小白 利用栈解决迷宫问题

C++小白 利用解决迷宫问题

迷宫问题是C或C++类竞赛中常见的问题,需要从大量的路径信息中挑选出正确路径,这就要求程序能快速读取数据并进行判断。栈自然成为解决这类问题的首选途径。

问题中的迷宫

C++小白 利用栈解决迷宫问题_第1张图片
蓝色圈为起点,绿色为终点

实现代码

先定义储存路径信息的栈和可行走方块的结构

#include
#include
#define maxsize 100 
#define N 10
using namespace std;
typedef struct{
	int i;                             //当前方块的行 
	int j;                             //当前方块的列 
	int num;                           //下一个可走相邻方块的方位号 
}box;
typedef struct{
	box data[maxsize];
	int top;
}stock;

接下来是寻找路径的函数
由于需要找到正确路径后迅速退出函数,所以此处用有两个返回值的bool而不是void

bool path(int mg[N][N],int xi,int yi,int se,int ye)//起点坐标与终点坐标 
{
	int i,j,k,di,find;
	int o,p;
	stock st;
	st.top=-1;//定义栈st并初始化 
	st.top++;//起点方块近栈 
	st.data[st.top].i=xi;
	st.data[st.top].j=yi;
	st.data[st.top].num=-1;
	mg[xi][yi]=-1;//当一个方块进栈,将迷宫值改为-1;目的是避免重复 
	while(st.top>-1)
	{
		i=st.data[st.top].i;
		j=st.data[st.top].j;
		di=st.data[st.top].num;
		if(i==se&&j==ye)
		{
			cout<<"迷宫路径如下:\n";
			for(k=0;k<=st.top;k++)
			{
				cout<<" st.data[k].i,st.data[k].j";
				if((k+1)%5==0){cout<<"\n";}
			}
			cout<<"\n";
			return true;
		}
		find=0;
		while(di<4&&find==0)
		{
			di++;
			switch(di)
			{
				case 0:i=st.data[st.top].i-1;j=st.data[st.top].j; break;
				case 1:i=st.data[st.top].i;j=st.data[st.top].j+1; break;
				case 2:i=st.data[st.top].i+1;j=st.data[st.top].j; break;
				case 3:i=st.data[st.top].i;j=st.data[st.top].j-1; break;
			}
			if(mg[i][j]==0){find=1;}//找到了下一个可走方块(i,j) 
		}
		if(find==1)
		{
			st.data[st.top].num=di;
			st.top++;
			st.data[st.top].i=i;
			st.data[st.top].j=j;
			st.data[st.top].num=-1;
			mg[i][j]=-1;
		}
		else
		{
			mg[st.data[st.top].i][st.data[st.top].j]=0;
			st.top--;
		}
	 } 
	 return false;//未找到正确路径 
}

再是主函数

int main()
{
	int mg[N][N]={                  //绘制迷宫
		{1,1,1,1,1,1,1,1,1,1},
		{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 xi,yi,se,ye,o,p;
	cout<<"请输入起点坐标:";
	cin>>xi>>yi;
	cout<<"请输入终点坐标:";
	cin>>se>>ye;
	path(mg,xi,yi,se,ye); 
	for(o=0;o<10;o++)
	 {
	 	for(p=0;p<10;p++)
	 	{
	 	    switch(mg[o][p]){
	 		case 1:cout<<"■"; break;
			case 0:cout<<"  "; break;
			case -1:cout<<"* "; break;
			}	
		 } 
		 cout<<"\n";
	 }
	 cout<<"■:障碍物      *:路线";
 } 

运行结果:
C++小白 利用栈解决迷宫问题_第2张图片
说实话,看到运行结果我是有点懵的,因为结果虽然正确,但并不是最短路径。
之后再进行改进,以便能寻找最佳路径吧

你可能感兴趣的:(c++,栈)