资源简介
问题描述:以一个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++
- 下一篇:飞机订票管理系统
相关资源
- linux下c语言实现多线程web服务器
- c++课程设计 职工工资管理系统
- C语言的读取GPS源码
- Linux下C语言2048游戏代码
- C语言战争游戏源代码
- 设计一个有 N个进程调度程序设计
- socket应用二 用C语言写远程屏幕监视程
- 数据结构题集答案(C语言版)严蔚敏
- 图书管理系统C语言+数据结构与算法
- 列车时刻表管理源代码(C语言)
- 《数据结构(c语言版)习题答案》严
- C语言下用单链表实现一元多项式的四
- C语言课程设计五子棋游戏带源代码
- CRC8/CRC16/CRC32常见几个标准的算法及
- 国际象棋代码实现
- ifft的c语言编程
- 计算机图形学画月亮C语言
- c语言生成scale-free network
- 高斯函数消元法c语言源代码,解矩阵
- 机器人C语言代码的一个详细
- AD5420驱动C语言
- ftp客户端的C语言实现
- 银行账户管理系统c++)
- 简单的Linux下Ftp客户端C语言编写
- 基于51单片机的人体感应灯设计
- C语言上机考试经典100题--南开大学出
- RSA加解密算法 C语言实现
- 马踏棋盘C语言算法
- 基于Huffman树的文件压缩C语言源码数据
- 巴特沃斯低通滤波器的c语言实现
评论
共有 条评论