资源简介
问题描述:以一个m×n的长方形表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
基本要求:首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。如:对于下列数据的迷宫,输出的一条通路为:(1,1,1), (1,2,2), (2,2,2)
(3,2,3), (3,1,2),…。
测试数据:迷宫的测试数据如下:左上角(1,1)为入口,右下角(9,8)为出口。
1 实现提示:计算机解迷宫通常用的是“穷举求解”方法,即从入口出发,顺着某一个方向进行探索,若能走通,则继续往前进;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。假如所有可能的通路都探索到而未能到达出口,则所设定的迷宫没有通路。可以用二维数组存储迷宫数据,通常设定入口点的下标为(1,1),出口点的下标为(n,n)。为处理方便起见,可在迷宫的四周加一障碍。对于迷宫任一位置,均可约定有东、南、西、北四个方向可通。

代码片段和文件信息
#include
#include
#include
#define ok 1
#define error 0
#define true 1
#define false 0
#define maxrow 10 //最大行数
#define maxrank 10 //最大列数
#define stack_max_size 100 //栈的最大长度
#define stackincrement 10 //栈的增加长度
typedef struct postype{ //迷宫坐标
int y; //纵坐标
int x; //横坐标
}postype;
typedef struct way{ //通道块储存结构
int ord; //通道块在“路径”上的序号
postype seat; //通道快在迷宫中的“坐标位置”
int di; //从此通道块走向下一个通道块的“方向”
}way; //栈的元素结构
typedef struct stack{ //栈结构
struct way *top; //栈顶指针
struct way *base; //栈底指针
int stacksize; //栈的总长度
}stack;
int maze[maxrow][maxrank]; //迷宫数组内容为1表示障碍,0表示通路,2表示走过足迹
int initmaze(postype *s1postype *s2)
//构建迷宫函数
{
int ij;
printf(“迷宫为10行10列,请构造迷宫版图(0为通路,1为障碍):\n“);
for(i=0;i<10;i++)
{
printf(“\n请输入迷宫第%d行构造:\n“i+1);
j=0;
while(j<10)
{
scanf(“%d“&maze[i][j]);
j++;
}//while
}
printf(“请输入起始坐标(如:2_3):“);
scanf(“%d%d“&s1->x&s1->y);
getchar();
printf(“请输入终点坐标(如:2_3):“);
scanf(“%d%d“&s2->x&s2->y);
getchar();
printf(“\n迷宫构造完成!\n“);
return ok;
}
int initstack(stack *s)
//构建一个空栈
{
s->base=(way*)malloc(stack_max_size*sizeof(way));
if(!s->base) exit(error);
s->top=s->base;
s->stacksize=stack_max_size;
return ok;
}
int push(stack *sway e)
//将e数据入栈
{
way *newbase;
if(s->top-s->base==s->stacksize) //若栈满则增加空间
{
newbase=(way*)realloc(s->base(s->stacksize+stackincrement)*sizeof(way));
if(!newbase) exit(error);
s->base=newbase;
s->top=s->base+s->stacksize;
s->stacksize+=stackincrement;
}
*s->top++=e;
return ok;
}
int pop(stack *sway *e)
//若栈不为空,则将栈顶元素出栈并保存到e中
{
if(s->base==s->top) return error; //栈为空错误
*e=*--s->top;
return ok;
}
int pass(postype e)
//判断通道块e是否可行,若可行返回ok,不可行返回error
{
if(maze[e.x][e.y]==0) return ok;
else return error;
}
int nextpos(postype *sint di)
//探索下一个通道块坐标,s1为现在坐标,s2返回下一步坐标,di为方向
{
if(di==1) s->x++;
if(di==2) s->y++;
if(di==3) s->x--;
if(di==4) s->y--;
return ok;
}
int stackempty(stack *s)
//判断栈s是否为空,空返回0,不空返回1
{
if(s->base==s->top) return 0;
else return 1;
}
int mazepath(stack *spostype startpostype end)
//迷宫求解函数,start为起始坐标,end为终点坐标
{
way e;
postype curpos; //当前位置
int curstep=1; //探索第一步
curpos=start; //设置当前位置为起始位置
if(!initstack(s)) exit(error);
do
{
if(pass(curpos))
{
maze[curpos.x][curpos.y]=2; //留下通过足迹
e.di=1;
e.ord=curstep;
e.seat=curpos;
push(se);
if(curpos.x==end.x&&curpos.y==end.y) return true; //结束
nextpos(&curpos1);
curstep++;
}//if
else
{
pop(s&e);
while(e.di==4&&stackempty(s)) pop(s&e);
if(e.di<4)
{
e.di++;
curpos=e.seat;
nextpos(&curpose
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2011-01-20 08:57 迷宫求解\
目录 0 2011-01-20 08:57 迷宫求解\Debug\
文件 33792 2011-04-24 14:04 迷宫求解\Debug\vc60.idb
文件 53248 2011-04-24 14:04 迷宫求解\Debug\vc60.pdb
文件 184378 2011-04-24 14:04 迷宫求解\Debug\迷宫求解.exe
文件 213924 2011-04-24 14:04 迷宫求解\Debug\迷宫求解.ilk
文件 10351 2011-04-24 14:04 迷宫求解\Debug\迷宫求解.obj
文件 43520 2011-04-24 13:43 迷宫求解\Debug\迷宫求解.opt
文件 186652 2011-04-24 10:03 迷宫求解\Debug\迷宫求解.pch
文件 451584 2011-04-24 14:04 迷宫求解\Debug\迷宫求解.pdb
文件 3743 2011-04-24 14:08 迷宫求解\迷宫求解.c
文件 3425 2011-04-24 12:39 迷宫求解\迷宫求解.dsp
文件 524 2011-04-24 14:08 迷宫求解\迷宫求解.dsw
文件 50176 2011-04-24 14:08 迷宫求解\迷宫求解.ncb
文件 48640 2011-04-24 14:08 迷宫求解\迷宫求解.opt
文件 752 2011-04-24 14:04 迷宫求解\迷宫求解.plg
- 上一篇:椭圆曲线密码ECC算法实现源码C++
- 下一篇:飞机订票管理系统
相关资源
- 操作系统c语言模拟文件管理系统844
- C语言开发实战宝典
- C++中头文件与源文件的作用详解
- C语言代码高亮html输出工具
- 猜数字游戏 c语言代码
- C语言课程设计
- 数字电位器C语言程序
- CCS FFT c语言算法
- 使用C语言编写的病房管理系统
- 通信过程中的RS编译码程序(c语言)
- 计算机二级C语言上机填空,改错,编
- 用回溯法解决八皇后问题C语言实现
- 简易教务管理系统c语言开发文档
- 操作系统课设 读写者问题 c语言实现
- 小波变换算法 c语言版
- C流程图生成器,用C语言代码 生成C语
- 3des加密算法C语言实现
- 简单的C语言点对点聊天程序
- 单片机c语言源程序(51定时器 八个按
- 个人日常财务管理系统(C语言)
- c语言电子商务系统
- 小甲鱼C语言课件 源代码
- 将图片转换为C语言数组的程序
- C语言实现的一个内存泄漏检测程序
- DES加密算法C语言实现
- LINUX下命令行界面的C语言细胞游戏
- 用单片机控制蜂鸣器播放旋律程序(
- 学校超市选址问题(数据结构C语言版
- 电子时钟 有C语言程序,PROTEUS仿真图
- 尚观培训linux许巍老师关于c语言的课
评论
共有 条评论