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

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

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

问题中的迷宫

蓝色圈为起点,绿色为终点

实现代码

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

#include<iostream>
#include<malloc.h>
#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<<"迷宫路径如下:
";
			for(k=0;k<=st.top;k++)
			{
          
   
				cout<<" st.data[k].i,st.data[k].j";
				if((k+1)%5==0){
          
   cout<<"
";}
			}
			cout<<"
";
			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<<"
";
	 }
	 cout<<"■:障碍物      *:路线";
 }

运行结果: 说实话,看到运行结果我是有点懵的😵,因为结果虽然正确,但并不是最短路径。 之后再进行改进,以便能寻找最佳路径吧

经验分享 程序员 微信小程序 职场和发展