迷宫的实现——基于栈知识

    栈的FILO(先进后出)特性得到了广泛应用,栈的递归调用实现在程序设计中主函数和子函数调用中发挥了很大的作用。在经典迷宫问题中,求从入口到出口的所有路径是一个经典的程序设计问题,通常都是采用“穷举求解”的方法,即从入口出发,顺着某一个方向向前搜索,若能走通,则继续往前走;否则沿原路返回,换一个方向再继续搜索,直到所有可能的通路都搜索到为止。在这个过程中采用栈结构保存从入口到当前位置的路径就很合适了。所谓简单路径就是所求得的路径上不能重复出现同一通道块。
    采用10*10矩阵来描述迷宫,其中1表示为墙,不能通行,0表示为通道,m表示迷宫求解的入口,e表示迷宫求解的出口,从m到e求解一条简单路径,输出路径信息。下述矩阵数据为迷宫数据信息:

实现过程:

1.定义栈的结构。

typedef struct

{

int x;

int y;

int c;  //东北西南方向依次进行(逆时针方向)

}stack;

2.定义迷宫。

char maze[MAXC][MAXR]={{'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'}};   //10*10迷宫

3.判断各个方向是否可通,以东为例。

case 1:     //东方向

{

if(maze[ep[i].x][ep[i].y+1]=='0')

{

i++;

ep[i].x=ep[i-1].x;  //进栈

ep[i].y=ep[i-1].y+1;

maze[ep[i].x][ep[i].y]='2';

}

else

{

ep[i].c+=1;

}

4.若路径不符合,则退栈。

else

{

maze[ep[i].x][ep[i].y]='0';  //退栈

ep[i].c=1;

i--;

ep[i].c+=1;

if(i==0)

{

return;

}

}

5.判断是否到终点,到后输出路径。

if(ep[i].x==x_end&&ep[i].y==y_end)

{

for(int j=0;j<i;j++)  //输出可通路径程序

{

maze[ep[j].x][ep[j].y]='*';

}

maze[8][8]='*';

for(int k=0;k<MAXC;k++)

{

for(int m=0;m<MAXR;m++)

{

printf("%c  ",maze[k][m]);

}

printf("\n");

}    

return;

}

6.运行结果。

 

7.全部代码。

#include "stdio.h"

#include "stdlib.h"

#define MAXC 10

#define MAXR 10

#define N 100

typedef struct

{

int x;

int y;

int c;  //东北西南方向依次进行(逆时针方向)

}stack;

 

char maze[MAXC][MAXR]={{'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'}};   //10*10迷宫

 

void search(stack ep[N],int x_start,int y_start,int x_end,int y_end)  //迷宫出口和入口(从0起计数)

{

int i=0;

ep[i].x=x_start;

ep[i].y=y_start;

maze[1][1]='2';

do

{

if(ep[i].c<5)

{

switch(ep[i].c)

{

case 1:     //东方向

{

if(maze[ep[i].x][ep[i].y+1]=='0')

{

i++;

ep[i].x=ep[i-1].x;  //进栈

ep[i].y=ep[i-1].y+1;

maze[ep[i].x][ep[i].y]='2';

}

else

{

ep[i].c+=1;

}

if(ep[i].x==x_end&&ep[i].y==y_end)

{

for(int j=0;j<i;j++)      //输出可通路径程序

{

maze[ep[j].x][ep[j].y]='*';

}

maze[8][8]='*';

for(int k=0;k<MAXC;k++)

{

for(int m=0;m<MAXR;m++)

{

printf("%c  ",maze[k][m]);

}

printf("\n");

}    

return;

}

break;

}

case 2:  //北方向

{

if(maze[ep[i].x-1][ep[i].y]=='0')

{

i++;  //进栈

ep[i].x=ep[i-1].x-1;

ep[i].y=ep[i-1].y;

maze[ep[i].x][ep[i].y]=2;

}

else

{

ep[i].c+=1;

}

if(ep[i].x==x_end&&ep[i].y==y_end)

{

for(int j=0;j<i;j++)   //输出可通路径程序

{

maze[ep[j].x][ep[j].y]='*';

}

maze[8][8]='*';

for(int k=0;k<MAXC;k++)

{

for(int m=0;m<MAXR;m++)

{

printf("%c  ",maze[k][m]);

}

printf("\n");

}    

return;

}

break;

}

case 3:   //西方向

{

if(maze[ep[i].x][ep[i].y-1]=='0')

{

i++;  //进栈

ep[i].x=ep[i-1].x;

ep[i].y=ep[i-1].y-1;

maze[ep[i].x][ep[i].y]='2';

}

else

{

ep[i].c+=1;

}

if(ep[i].x==x_end&&ep[i].y==y_end)

{

for(int j=0;j<i;j++)  //输出可通路径程序

{

maze[ep[j].x][ep[j].y]='*';

}

maze[8][8]='*';

for(int k=0;k<MAXC;k++)

{

for(int m=0;m<MAXR;m++)

{

printf("%c  ",maze[k][m]);

}

printf("\n");

}    

return;

}

break;

}

case 4:   //南方向

{

if(maze[ep[i].x+1][ep[i].y]=='0')

{

i++;  //进栈

ep[i].x=ep[i-1].x+1;

ep[i].y=ep[i-1].y;

maze[ep[i].x][ep[i].y]='2';

}

else

{

ep[i].c+=1;

}

if(ep[i].x==x_end&&ep[i].y==y_end)

{

for(int j=0;j<i;j++)  //输出可通路径程序

{

maze[ep[j].x][ep[j].y]='*';

}

maze[8][8]='*';

for(int k=0;k<MAXC;k++)

{

for(int m=0;m<MAXR;m++)

{

printf("%c  ",maze[k][m]);

}

printf("\n");

}    

return;

}

break;    

}

}

}

else

{

maze[ep[i].x][ep[i].y]='0';  //退栈

ep[i].c=1;

i--;

ep[i].c+=1;

if(i==0)

{

return;

}

}

}while(1);

}

void main()

{

int x_start,y_start,x_end,y_end;

x_start=1;  //迷宫入口(在矩阵中的)

y_start=1;

x_end=8;

y_end=8;

stack ep[N];

for(int j=0;j<N;j++)

{

ep[j].c=1;

}

    search(ep,x_start,y_start,x_end,y_end);

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值