c语言用二维数组存储迷宫,走迷宫(C语言).docx

走迷宫(C语言)

迷宫问题【问题描述】 以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 【基本要求】首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出,其中(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。如:对于下列教据的迷宫,输出的一条通路为:(1,1,1 ),(l , 2,2),(2,2,2),(3 ,2,3),(3 ,l, 2),…。【测试数据】迷宫的测试数据如下:左上角(l,l)为入口.右下角(8, 9)为出口。

【实现提示】 计算机解迷宫通常用的是“穷举求解”方法,即从入口出发,顺着某一个方向进行探索,若能走通,则继续往前进;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。假如所有可能的???路都探索到而未能到达出口,则所设定的迷宫没有通路。可以二维数组存储迷宫数据,通常设定入口点的下标为(1,1),出口点的下标为(n,n)。为处理方便起见,可在迷宫的四周加一圈障碍。对于迷宫中任一位置,均可约定有东、南、西、北(编号分别为1,2,3,4)四个方向可通。

#include #include #define stackinitsize 200#define stackincrement 10typedef struct{ int x; int y;}locat;typedef struct{ locat seat; int direct;}SET;typedef struct{ SET *base; SET *top; int stacksize;}stack;int mg[11][10];

void initstack(stack &s){ s.base=(SET *)malloc(stackinitsize*sizeof(SET)); if(!s.base) exit(0); s.top=s.base; s.stacksize=stackinitsize;}

int empty(stack s){ if(s.base==s.top) return 1; else return 0;}

int pass(locat e){ if(mg[e.x][e.y]==0) return 1; else return 0;}void printpass(locat e){ mg[e.x][e.y]=7;}void push(stack &s,SET e){ if(s.top-s.base>=s.stacksize) { s.base=(SET *)realloc(s.base,(stackinitsize+stackincrement)*sizeof(SET)); if(!s.base) exit(0); s.top=s.base+s.stacksize; s.stacksize+=stackincrement; } *s.top=e; s.top++;}locat next(locat e,int n){ locat E; switch(n) { case 2:E.x=e.x+1; E.y=e.y; break; case 1:E.x=e.x; E.y=e.y+1; break; case 4:E.x=e.x-1; E.y=e.y; break; case 3:E.x=e.x; E.y=e.y-1; break; } return E;}int down(stack &s,SET &e){ if(s.base==s.top) return 0; else { s.top--; e=*s.top; return 1; }}void printunpass(locat e){ mg[e.x][e.y]=3;}int maze(){ stack s; initstack(s); locat curpos,start,end; start.x=1; start.y=1;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值