迷宫求解问题

写的不好,还可以改进。。。代码如下



#include<stdio.h>

#include<stdlib.h>
#include<malloc.h>
#define stack_size 100
#define ADDLENGTH 10


typedef struct
{
int x;
int y;
} postype;
typedef struct
{
int ord;
postype seat;
int di;
}elemtype;
typedef struct
{
elemtype *base;
elemtype *top;
int size;
}sqstack;
int flag = 0;


void initstack(sqstack *s)
{
s->base = (elemtype *)malloc(stack_size * sizeof(elemtype));
if (!s->base) exit(0);
s->top = s->base;
s->size = stack_size;
return;
}//建立空栈
int stackempty(sqstack *s)//判定栈是否为空
{
if (s->top == s->base)//判定栈顶、栈底指针是否指向同一位置
return(1);
else return(0);
}
void push(sqstack *s, elemtype e)//往栈顶加元素
{
if (s->top - s->base == s->size - 1)//长度将达到当前的上限值
{
realloc(s->base, (s->size + ADDLENGTH)*sizeof(elemtype));//增加存储空间
s->top = s->base + (s->size - 1);
s->size += ADDLENGTH;
}
(*(s->top)).ord = e.ord;
(*(s->top)).seat.x = e.seat.x;
(*(s->top)).seat.y = e.seat.y;
(*(s->top)).di = e.di;
s->top++;
}
void pop(sqstack *s, elemtype *e)//删除栈顶数据
{
if (s->top == s->base) { exit(0); }
(s->top)--;
e->ord = (*(s->top)).ord;
e->seat.x = (*(s->top)).seat.x;
e->seat.y = (*(s->top)).seat.y;
e->di = (*(s->top)).di;
return;
}
void clearstack(sqstack *s)//将s栈清空
{
s->top = s->base;
s->size = 0;
}


void nextpath(postype *tp, int d)
{
switch (d)
{
case 1:tp->y++; break;
case 2:tp->x++; break;
case 3:tp->y--; break;
case 4:tp->x--; break;
}
}
void mazepath(int(*maze)[10])
{
int i, j;
printf("打印迷宫:\n");
for (i = 0; i<10; i++)
{
for (j = 0; j<10; j++)
{
printf("%d", maze[i][j]);


}
printf("\n");
}
elemtype e;
postype curpos;
sqstack s;
initstack(&s);
curpos.x = 1;
curpos.y = 1;
int p = 8, q = 8;
int mark[10][10] = { 0 };
int curstep = 1;
do
{
if (maze[curpos.x][curpos.y] == 0 && mark[curpos.x][curpos.y] == 0)
{
mark[curpos.x][curpos.y] = 1;
e.ord = curstep;
e.seat.x = curpos.x;
e.seat.y = curpos.y;
e.di = 1;
push(&s, e);
printf("(%d,%d)\n", e.seat.x, e.seat.y);
if (curpos.x == p && curpos.y == q)
{
flag = 1;
printf("%d\n", curstep);
printf("走出的路径为");
while (stackempty(&s)==0)
{
pop(&s, &e);
printf("<--(%d,%d)", e.seat.x, e.seat.y);
}
printf("<--[起点]");
printf("\n");
clearstack(&s);
}
nextpath(&curpos, 1);
curstep++;
}//if
else
{
if (stackempty(&s) == 0)
pop(&s, &e);
while (e.di == 4 && stackempty(&s) == 0)
{
mark[curpos.x][curpos.y] = 1;
pop(&s, &e);
}
if (e.di < 4)
{
e.di++;
push(&s, e);
curpos.x = e.seat.x;//**curpos=NextPos(e.seat,e,di)
curpos.y = e.seat.y;
nextpath(&curpos, e.di);




}

}
} while (stackempty(&s) == 0);


}






void main()
{
int maze[10][10] = 
 { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 0, 1, 0, 0, 0, 1, 0, 1,
1, 0, 0, 0, 0, 1, 0, 1, 0, 1,
1, 0, 0, 1, 1, 0, 0, 0, 0, 1,
1, 1, 1, 1, 1, 0, 0, 1, 0, 1,
1, 0, 0, 0, 1, 0, 0, 0, 0, 1,
1, 0, 1, 0, 0, 1, 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 };
mazepath(maze);
return;
}
程序在VC++ 6下顺利编译通过。 一、 实验目的: (1) 熟练掌握链栈的基本操作及应用。 (2) 利用链表作为栈的存储结构,设计实现一个求解迷宫的非递归程序。 二、实验内容: 【问题描述】 以一个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)为入口,右下角(8,9)为出口。 1 2 3 4 5 6 7 8 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 1 0 1 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 以方阵形式输出迷宫及其通路。 输出: 请输入迷宫的长和宽:5 5 请输入迷宫内容: 0 1 1 0 0 0 0 1 1 0 1 0 0 1 1 1 0 0 1 0 1 1 0 0 0 迷宫的路径为 括号内的内容分别表示为(行坐标,列坐标,数字化方向,方向) (1,1,1,↓) (2,1,2,→) (2,2,1,↓) (3,2,1,↓) (4,2,2,→) (4,3,1,↓) (5,3,2,→) (5,4,2,→) (5,5,0,) 迷宫路径探索成功!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值