1:①、定义一个顺序栈;
②、编写走出迷宫代码;
③、编写主函数。
1、栈:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<iostream>
#define MaxSize 100
//①、定义一个顺序栈;
typedef struct
{ int i;
int j;
int di;
} Box;
typedef struct
{ Box data[MaxSize];
int top;
} StType;
//②、编写走出迷宫代码;
bool mgpath(int xi,int yi,int xe,int ye)
{ int i,j,k,di,find;
StType st;
st.top=-1;
st.top++;
st.data[st.top].i=xi; st.data[st.top].j=yi;
st.data[st.top].di=-1; mg[xi][yi]=-1;
while (st.top>-1)
{ i=st.data[st.top].i;j=st.data[st.top].j;
di=st.data[st.top].di;
if (i==xe && j==ye)
{ printf("迷宫路径如下:\n");
for (k=0;k<=st.top;k++)
{ printf("\t(%d,%d)",st.data[k].i,st.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=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;
}
if (find==1)
{ st.data[st.top].di=di;
st.top++;
st.data[st.top].i=i; st.data[st.top].j=j;
st.data[st.top].di=-1;
mg[i][j]=-1;
}
else
{ mg[st.data[st.top].i][st.data[st.top].j]=0;
st.top--;
}
}
return false;
}
//③、编写主函数:
得到迷宫路径如下:
(1,1) (1,2) (2,2) (3,2) (3,1)
(4,1) (5,1) (5,2) (5,3) (6,3)
(6,4) (6,5) (5,5) (4,5) (4,6)
(4,7) (3,7) (3,8) (4,8) (5,8)
(6,8) (7,8) (8,8)
2、队列
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<iostream>
#define MaxSize 100
//①、定义一个顺序栈;
typedef struct
{ int i,j;
int pre;
} Box;
typedef struct
{ Box data[MaxSize];
int front,rear;
} QuType;
//②、编写走出迷宫代码;:
bool mgpath1(int xi,int yi,int xe,int ye)
{ int i,j,find=0,di;
QuType qu;
qu.front=qu.rear=-1;
qu.rear++;
qu.data[qu.rear].i=xi; qu.data[qu.rear].j=yi;
qu.data[qu.rear].pre=-1;
mg[xi][yi]=-1;
while (qu.front!=qu.rear && !find)
{ qu.front++;
i=qu.data[qu.front].i; j=qu.data[qu.front].j;
if (i==xe && j==ye)
{ find=1; print(qu,qu.front); return true; }
for (di=0;di<4;di++)
{ switch(di)
{
case 0:i=qu.data[qu.front].i-1;
j=qu.data[qu.front].j; break;
case 1:i=qu.data[qu.front].i;
j=qu.data[qu.front].j+1; break;
case 2:i=qu.data[qu.front].i+1;
j=qu.data[qu.front].j; break;
case 3:i=qu.data[qu.front].i;
j=qu.data[qu.front].j-1; break;
}
if (mg[i][j]==0)
{ qu.rear++;
qu.data[qu.rear].i=i; qu.data[qu.rear].j=j;
qu.data[qu.rear].pre=qu.front;
mg[i][j]=-1;
}
}
}
return false;
}
//③、编写主函数:
得到迷宫路径如下:
(1,1)(2,1)(3,1)(4,1)(5,1)
(5,2)(5,3)(6,3)(6,4)(6,5)
(7,5)(8,5)(8,6)(8,7)(8,8)
通过用栈和队列两种方法来写迷宫问题。了解到了栈和队列的相同点和不同点。栈是通过回溯进行的。为了便于回溯,对于可走的方块都要进栈,并试探它的下一可走的方位,将这个可走的方位保存到栈中。这是栈对于迷宫问题选择的方法。而队列则是利用队列的特点,一层一层向外扩展可走的点,直到找到出口为止。相当于我们后面在图那章学到的广度优先搜索方法。而对于在实验期间,其中有很多字母大小写。所以经常搞混,以至于出现了一些问题。还经常会把逗号与分号搞错。