迷宫问题是C或C++类竞赛中常见的问题,需要从大量的路径信息中挑选出正确路径,这就要求程序能快速读取数据并进行判断。栈自然成为解决这类问题的首选途径。
先定义储存路径信息的栈和可行走方块的结构
#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<<"■:障碍物 *:路线";
}
运行结果:
说实话,看到运行结果我是有点懵的,因为结果虽然正确,但并不是最短路径。
之后再进行改进,以便能寻找最佳路径吧