使用C/C++解决迷宫问题
一、设计步骤
1、绘制迷宫
int Mg[10][10]={ {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}
}; //此处为一个语句,不要忘记加分号 ,代码功能为绘制迷宫
2、定义结构体
typedef struct{
int i;
int j;
int di;
}box; //定义了一个方格块结构体
typedef struct{
box data[100];
int top;
}MING; //定义了一个栈用来存放迷宫出口路径
3、设计自定义函数,用于寻找出口
bool XunZhao(int x0,int y0,int xi,int yi){ //该函数为bool型
MING Mi;
Mi.top=-1;
Mi.top++; //前三行代码定义栈并初始化
int i,j,k,di,find;
Mi.data[Mi.top].i=x0;
Mi.data[Mi.top].j=y0;
Mi.data[Mi.top].di=-1; //5至7行代码将第一个元素入栈
while(Mi.top>-1){ //判断栈是否为空
i=Mi.data[Mi.top].i;
j=Mi.data[Mi.top].j;
di=Mi.data[Mi.top].di; //将栈中方格信息存放到变量i,j,di中,此处需要注意为了避免迷宫陷入死循环,该三行赋值语句应该放在while循环内
Mg[i][j]=-1; //避免重复路径
if(i==xi&&j==yi){ //判断出口是否找到
printf("迷宫出口为:\n");
for(k=0;k<=Mi.top;k++){
printf("\t(%d,%d)",Mi.data[k].i,Mi.data[k].j); //这里的\t为输出格式控制符
if((k+1)%5==0) //控制每输出五个方格坐标就换行,注意此处是(k+1)%5而不是k%5
printf("\n");
}
printf("\n"); //输出格式控制,此行代码可有可无
return true; //如果找到出口,函数返回true,无需再执行后面的代码
}
find=0; //设置标记
while(di<4&&find==0){
di++;
switch(di){
case 0:
i=Mi.data[Mi.top].i; //这里需要特别注意,不能因为横坐标没有变而省略该行代码,否则在后面di++后再次进入switch语句时,寻找迷宫出口时会出现问题
j=Mi.data[Mi.top].j-1; //向上寻找出口
break;
case 1:
i=Mi.data[Mi.top].i+1;
j=Mi.data[Mi.top].j; //向右寻找出口
break;
case 2:
i=Mi.data[Mi.top].i;
j=Mi.data[Mi.top].j+1; //向下寻找出口
break;
case 3:
i=Mi.data[Mi.top].i-1;
j=Mi.data[Mi.top].j; //向左寻找出口
break;
}
if(Mg[i][j]==0)
find=1; //找到了可作为出口路径的下一个方格
}
if(find==1){
Mi.data[Mi.top].di=di;
Mi.top++;
Mi.data[Mi.top].i=i;
Mi.data[Mi.top].j=j;
Mi.data[Mi.top].di=-1;
} //将找到的方格入栈
else{
Mg[Mi.data[Mi.top].i][Mi.data[Mi.top].j]=0;
Mi.top--;
} //没有找到可走的路径,将该方格退栈,并将该方格标记为于其他路径可行状态
}
return false; //没有找到出口,函数返回false
}
4、设计主函数
int main(){
if(!XunZhao(1,1,M,N))
printf("无解\n"); //如果没有找到出口,输出无解
}
二、解决该问题的完整代码及代码的局限性
#include <stdio.h>
#include <stdlib.h>
int M=8,N=8;
int Mg[10][10]={ {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}
};
typedef struct{
int i;
int j;
int di;
}box;
typedef struct{
box data[100];
int top;
}MING;
bool XunZhao(int x0,int y0,int xi,int yi){
MING Mi;
Mi.top=-1;
Mi.top++;
int i,j,k,di,find;
Mi.data[Mi.top].i=x0;
Mi.data[Mi.top].j=y0;
Mi.data[Mi.top].di=-1;
while(Mi.top>-1){
i=Mi.data[Mi.top].i;
j=Mi.data[Mi.top].j;
di=Mi.data[Mi.top].di;
Mg[i][j]=-1;
if(i==xi&&j==yi){
printf("迷宫出口为:\n");
for(k=0;k<=Mi.top;k++){
printf("\t(%d,%d)",Mi.data[k].i,Mi.data[k].j);
if((k+1)%5==0)
printf("\n");
}
printf("\n");
return true;
}
find=0;
while(di<4&&find==0){
di++;
switch(di){
case 0:
i=Mi.data[Mi.top].i;
j=Mi.data[Mi.top].j-1;
break;
case 1:
i=Mi.data[Mi.top].i+1;
j=Mi.data[Mi.top].j;
break;
case 2:
i=Mi.data[Mi.top].i;
j=Mi.data[Mi.top].j+1;
break;
case 3:
i=Mi.data[Mi.top].i-1;
j=Mi.data[Mi.top].j;
break;
}
if(Mg[i][j]==0)
find=1;
}
if(find==1){
Mi.data[Mi.top].di=di;
Mi.top++;
Mi.data[Mi.top].i=i;
Mi.data[Mi.top].j=j;
Mi.data[Mi.top].di=-1;
}
else{
Mg[Mi.data[Mi.top].i][Mi.data[Mi.top].j]=0;
Mi.top--;
}
}
return false;
}
int main(){
if(!XunZhao(1,1,M,N))
printf("无解\n");
}
局限性:1、地图及出口是固定的,不能自动更新;
2、该方法寻找到的路径不是最优解。