用栈实现迷宫
迷宫问题是经典的一类问题,如何从给出的入口找到对应的出口,实现的方法和马踏棋盘问题相似也是通过找到周围8个方向坐标的关系,然后依据深度优先搜索方法和一定的条件找到下一步对应的出路。由于迷宫问题需要存储具体的完成路径,这与前面的问题存在一定的差别。采用栈能够很好的解决这个问题,其中栈结构用来存储具体的坐标和方向。这样根据栈就能保证以后每一次都能快速的找到出路。
主要步骤如下:
创建一个堆栈空间,可以采用静态数组的方式,但由于不能准确的估计数组空间大小,可以采用动态创建的方式。并将入口坐标值压入到栈中。定义一个与迷宫大小相同的矩阵map,用来统计当前坐标是否已经到达过,当没有到达坐标(i,j)时,则有map[nowi][nowj]=0表示通道map[nowi][nowj]=1表示墙map[nowi][nowj]=2表示现在的位置map[nowi][nowj]= 3表示走过的地方map[nowi][nowj]= 4表示已经确定走不通的地方.这样主要是为了避免形成内部死循环,同时说明此路不能走通。
主要实现代码如下:
#include<stdio.h>
#include<stdlib.h>#include"Stack.c"
int m = 12 , n = 14 ;
int starti = 1 , startj = 1;
int endi=10,endj=12;
int map[12][14]={ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1,
1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1,
1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1,
1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1,
1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1,
1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1,
1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 1 ,0 ,0, 0 ,0 ,1 ,0 ,1 ,1,
1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1,
1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
};
/*
0 表示 通道
1 表示 墙
2 表示 现在的位置
3 表示 走过的地方
4 表示 已经确定走不通的地方
*/
//打印地图
void printMap()
{
int i,j;
for(i=0;i<m;i++){
for(j=0;j<n;j++){
switch (map[i][j]){
case 0: printf(" "); break;
case 1: printf("▉"); break;
case 2: printf("☆"); break;
case 3: printf("●"); break;
case 4: printf("×"); break;
}
}
printf("\n");
}
}
//查找可以走的路 返回 -1: 迷宫无解 0 :没有通路 1:右 2:下 3:左 4:上
int lookupPath (int nowi , int nowj)
{
if( (map[nowi+1][nowj]==4||map[nowi+1][nowj]==1)&&
(map[nowi-1][nowj]==4||map[nowi-1][nowj]==1)&&
(map[nowi][nowj+1]==4||map[nowi][nowj+1]==1)&&
(map[nowi][nowj-1]==4||map[nowi][nowj-1]==1)) return -1;
if(map[nowi][nowj+1]==0) return 1; //右
if(map[nowi+1][nowj]==0) return 2; //下
if(map[nowi][nowj-1]==0) return 3; //左
if(map[nowi-1][nowj]==0) return 4; //上
return 0;
}
void doWalk()
{
int next;
int nowi,nowj;
Data data;
Stack *s = createStack();
nowi=starti;
nowj=startj;
map[nowi][nowj]=2;
data.i=nowi;data.j=nowj;
push(s,data);
while(!(nowi==endi&&nowj==endj)){ //当现在的位置不是终点时
system("cls");
//走下一步
next=lookupPath (nowi,nowj);
if(next==0){
map[nowi][nowj]=4;
pop(s);
data=getTop(s);
nowi=data.i;nowj=data.j;
map[nowi][nowj]=2;
}
else if(next==-1){
printf("迷宫没有出口!");
exit(1);
}
else{
map[nowi][nowj]=3;
switch(next){
case 1: nowj++; break;
case 2: nowi++; break;
case 3: nowj--; break;
case 4: nowi--; break;
}
map[nowi][nowj]=2;
data.i=nowi;data.j=nowj;
push(s,data);
}
//打印地图
printMap();
}
}
int main(void)
{
int i;
doWalk();
return 0;
}
其中引用用了一个栈的基本创建的文件
#include<stdio.h>
#include<stdlib.h>
#define Max 100
typedef struct{
int i;
int j;
}Data;
typedef struct {
int top;
Data data[Max];
}Stack;
//创建一个栈并初始化
Stack * createStack()
{
Stack * s;
s = (Stack *) malloc (sizeof(Stack)) ;
s->top = -1;
return s ;
}
//判栈空
int isEmpty ( Stack * s )
{
return s->top==-1;
}
//判栈满
int isFull ( Stack * s )
{
return s->top == Max-1;
}
//入栈
int push ( Stack * s , Data data )
{
if(isFull(s)) return 0;
s->data[++s->top] = data ;
return 1;
}
//出栈
Data pop ( Stack * s )
{
if(isEmpty(s)) return;
return s->data[s->top--];
}
//取栈顶元素
Data getTop ( Stack * s)
{
if(isEmpty(s)) return;
return s->data[s->top];
}
/*
int main(void)
{
int i;
Data data;
Stack * s = createStack();
for(i=0;i<5;i++){
data.i=i;
data.j=i;
push(s,data);
}
while(!isEmpty(s)){
data = pop(s);cc
printf("%d %d\n",data.i,data.j);
}
return 0;
}*/