1.用栈解决
/*用栈求解迷宫问题*/
#include<stdio.h>
#define maxsize 100
typedef struct
{
int i; //行号
int j; //列号
int di; //方位
}BOX;
typedef struct
{
BOX data[maxsize];
int top; //栈顶
} stType;
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}
};//地图
int M=8;//行数
int N=8;//列数
bool mgpath(int x,int y,int xe,int ye)
{
BOX path[maxsize];
int k=0,di=-1,i,j,find=0;
stType s;
s.top=-1;
s.top++;
s.data[s.top].i=x;
s.data[s.top].j=y;
s.data[s.top].di=-1;
mg[x][y]=-1; //将入口处的迷宫值设为-1避免重复走到该处
while(s.top!=-1)
{
di=s.data[s.top].di;//原因:若栈顶元素是第一次做栈顶则:每个栈的栈顶元素的di值均为-1
//若栈顶元素是第二次做栈顶即曾进栈过一个元素,但这个元素无相邻的可走方块从而回退到栈顶元素,
//则应从目前栈顶元素di的di+1方向开始找,
//因为刚刚di之前的已经找过路了,di方向对应的元素方块无相邻的可走方块
if(s.data[s.top].i==xe&&s.data[s.top].j==ye)
{
printf("迷宫路径如下:\n");
while(s.top!=-1)
{
path[k++]=s.data[s.top];
s.top--;
}
while(k>=1)
{
k--;
printf("\t(%d,%d)",path[k].i,path[k].j);
if((k+2)%5==0)
printf("\n");
}
return true;
}
else
{
find=0;
while(di<=3)
{
printf("di1:%d\n",di);
printf("------------\n");
di++;
printf("di:%d\n",di);
if (di==1)
{
i=s.data[s.top].i;
j=s.data[s.top].j+1;
}
else if(di==2)
{
i=s.data[s.top].i+1;
j=s.data[s.top].j;
}
else if(di==3)
{
i=s.data[s.top].i;
j=s.data[s.top].j-1;
}
else if(di==0)
{
i=s.data[s.top].i-1;
j=s.data[s.top].j;
}
if (mg[i][j]==0)
{
s.data[s.top].di=di;
s.top++;
s.data[s.top].di=-1;
s.data[s.top].i=i;
s.data[s.top].j=j;
find=1;
mg[i][j]=-1;
break;
}
}
printf("===========\n");
if(find==0)
{
mg[s.data[s.top].i][s.data[s.top].j]=0;
s.top--;
}
}
}
return false;
}
int main()
{
if(mgpath(1,1,M,N)!=true)
printf("false!!\n");
return 0;
}
2.用队列解决
函数:
bool mgpath(int x,int y,int xe,int ye)
{
qutype q;
int i,j;
q.front=q.rear=-1;
q.rear++;
q.data[q.rear].i=x;
q.data[q.rear].j=y;
q.data[q.rear].pre=-1;
mg[x][y]=-1;
while(q.rear!=-1)
{
q.front++;
i=q.data[q.front].i;
j=q.data[q.front].j;
if (i==xe&&j==ye)
{
print(q,q.front);
return true;
}
else
{
for(int di=0;di<4;di++)
{
if (di==1)
{
i=q.data[q.front].i;
j=q.data[q.front].j+1;
}
else if(di==2)
{
i=q.data[q.front].i+1;
j=q.data[q.front].j;
}
else if(di==3)
{
i=q.data[q.front].i;
j=q.data[q.front].j-1;
}
else if(di==0)
{
i=q.data[q.front].i-1;
j=q.data[q.front].j;
}
if(mg[i][j]==0)
{
q.rear++;
q.data[q.rear].i=i;
q.data[q.rear].j=j;
q.data[q.rear].pre=q.front;
mg[i][j]=-1;
}
}
}
}
return false;
}
完整代码:
#include<stdio.h>
#define maxsize 100
typedef struct
{
int i; //行号
int j; //列号
int pre; //上一个方块的下标
}BOX;
typedef struct
{
BOX data[maxsize];
int front,rear;
}qutype;
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}
};//地图
int M=8;//行数
int N=8;//列数
void print(qutype q,int front)
{
printf("ok!\n");
int k=front,k1;
printf("k:%d\n",k);
do
{
k1=k;
k=q.data[k].pre;
// printf("k:%d\n",k);
q.data[k1].pre=-1;
}while(k!=0);
printf("路径如下:\n");
for(int k=0;k<maxsize;k++)
{
int j=0;
if(q.data[k].pre==-1)
{
j++;
printf("(%d,%d)",q.data[k].i,q.data[k].j);
if(j%5==0)
printf("\n");
}
}
}
bool mgpath(int x,int y,int xe,int ye)
{
qutype q;
int i,j;
q.front=q.rear=-1;
q.rear++;
q.data[q.rear].i=x;
q.data[q.rear].j=y;
q.data[q.rear].pre=-1;
mg[x][y]=-1;
while(q.rear!=-1)
{
q.front++;
i=q.data[q.front].i;
j=q.data[q.front].j;
if (i==xe&&j==ye)
{
print(q,q.front);
return true;
}
else
{
for(int di=0;di<4;di++)
{
if (di==1)
{
i=q.data[q.front].i;
j=q.data[q.front].j+1;
}
else if(di==2)
{
i=q.data[q.front].i+1;
j=q.data[q.front].j;
}
else if(di==3)
{
i=q.data[q.front].i;
j=q.data[q.front].j-1;
}
else if(di==0)
{
i=q.data[q.front].i-1;
j=q.data[q.front].j;
}
if(mg[i][j]==0)
{
q.rear++;
q.data[q.rear].i=i;
q.data[q.rear].j=j;
q.data[q.rear].pre=q.front;
mg[i][j]=-1;
}
}
}
}
return false;
}
int main()
{
if(mgpath(1,1,M,N)!=true)
printf("false!!\n");
return 0;
}
3.用递归
#include<stdio.h>
#include<stdlib.h>
#define maxsize 100
typedef struct
{
int i;
int j;
} Box;
typedef struct
{
Box data[maxsize];
int length;
}pathtype;
int mg[6][6]= {{1,1,1,1,1,1},
{1,0,0,0,1,1},
{1,0,1,0,0,1},
{1,0,0,0,1,1},
{1,1,0,0,0,1},
{1,1,1,1,1,1}
};//地图
int M=4;//行数
int N=4;//列数
int I=0;
void mgpath(int x,int y,int xe,int ye,pathtype path)
{
if(x==xe&&y==ye)
{
path.data[path.length].i=x;
path.data[path.length].j=y;
mg[x][y]=-1;
path.length++;
//printf("I:%d\n",I++);
for(int k=0;k<path.length;k++)
{
printf("\t(%d,%d)\t",path.data[k].i,path.data[k].j);
// if((k+1)%5==0)
// printf("\n");
}
printf("\n");
}
else
{
if(mg[x][y]==0) //[x][y]可走
{
int di=0,i1,j1;
while(di<4)
{
path.data[path.length].i=x;
path.data[path.length].j=y;
// mg[x][y]=-1;
path.length++;
switch(di)
{
case 0:i1=x-1;j1=y;break;
case 1:i1=x;j1=y+1;break;
case 2:i1=x+1;j1=y;break;
case 3:i1=x;j1=y-1;break;
}
mg[x][y]=-1;
mgpath(i1,j1,xe,ye,path);
path.length--; //回退找不同的路径
mg[x][y]=0;
di++;
}
}
}
}
int main()
{
pathtype p;
p.length=0;
int x=1,y=1,xe=4,ye=4;
mgpath(x,y,xe,ye,p);
return 0;
}