用栈实现迷宫s

                     用栈实现迷宫

    迷宫问题是经典的一类问题,如何从给出的入口找到对应的出口,实现的方法和马踏棋盘问题相似也是通过找到周围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; 
}*/

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值