主题:(原创)栈的运用:求解迷宫路径
自己写的一个程序,给大家分享一下
好的给顶一下。。。。
#include<stdio.h>
#include<graphics.h>
#include "Conio.h"
typedef int mazetype[10][10];
/* 0,1,2,3,4,5,6,7,8,9 */
mazetype maze={0,0,0,0,0,0,0,0,0,0, /* 0 */ /* 1表示通路,0表示墙壁 */
0,1,1,0,1,1,1,0,1,0, /* 1 */ /* 起点位置为(1,1) */
0,1,1,0,1,1,1,0,1,0, /* 2 */ /* 终点位置为(8,8) */
0,1,1,1,1,0,0,1,1,0, /* 3 */ /* 2为走过的路 */
0,1,0,0,0,1,1,1,1,0, /* 4 */ /* 3为走了不能通过的死路 */
0,1,1,1,0,1,1,1,1,0, /* 5 */
0,1,0,1,1,1,0,1,1,0, /* 6 */
0,1,0,0,0,1,0,0,1,0, /* 7 */
0,0,1,1,1,1,1,1,1,0, /* 8 */
0,0,0,0,0,0,0,0,0,0}; /* 9 */
typedef struct{
int x;
int y;}postype;/* 迷宫块的坐标 */
typedef struct{ /* 迷宫块各参数 */
postype seat;/* 通道块在路径上的坐标 */
int direction;}mazepiece;
/* ------------定义栈的结构体------------- */
typedef struct{
mazepiece *base;
mazepiece *top;
int stacksize;}sqstack;
void initgr(void)
{
int gd=DETECT,gm=0;
registerbgidriver(EGAVGA_driver);
initgraph(&gd,&gm,"");
}
box(int x1,int y1,int x2,int y2,int color)/* 7为白色,4为红色 */
{
int i,j,nowcolor;
nowcolor=getcolor();
for (i=0;i<=y2-y1;i++)
{
setwritemode(1);
setcolor(color);
line(x1,y1+i,x2,y1+i);
}
setcolor(nowcolor);
setwritemode(0);
}
/* -----------栈的初始化----------------- */
initstack(sqstack *s)
{
s->base=(mazepiece *)malloc(100*sizeof(mazepiece));
if(!s->base)
exit();
s->top=s->base;
s->stacksize=100;
}
/* ------------求当前栈的长度----------- */
int length(sqstack *s)
{
return s->top-s->base;
}
/* --------------把元素e压入栈中------------------ */
push(sqstack *s,mazepiece e)
{
if(length(s)>=s->stacksize)
{
s->base=(mazepiece *)realloc(s->base,(s->stacksize+10)*sizeof(mazepiece));
if(!s->base) exit();
s->top=s->base+s->stacksize;
/* 为下一次插入作准备,下一次插入的时候不会出现错误追加空间 */
s->stacksize+=10;
}
*s->top=e;
s->top++;
}
/* -----------弹出当前栈顶元素------------- */
mazepiece pop(sqstack *s)
{
mazepiece e;
if(s->top==s->base) exit();
e=*(--s->top);
return e;
}
/* ---------走过的路留下”脚印“----------------- */
void footprint(postype a)
{
maze[a.x][a.y]=2;
}
postype nextpos(postype c,int di)
{ /* 根据当前位置及移动方向,返回下一位置 */
postype direc[4]={{0,1},{1,0},{0,-1},{-1,0}}; /* {行增量,列增量} */
/* 移动方向,依次为东南西北 */
c.x+=direc[di].x;
c.y+=direc[di].y;
return c;
}
好的给顶一下。。。。
#include<stdio.h>
#include<graphics.h>
#include "Conio.h"
typedef int mazetype[10][10];
/* 0,1,2,3,4,5,6,7,8,9 */
mazetype maze={0,0,0,0,0,0,0,0,0,0, /* 0 */ /* 1表示通路,0表示墙壁 */
0,1,1,0,1,1,1,0,1,0, /* 1 */ /* 起点位置为(1,1) */
0,1,1,0,1,1,1,0,1,0, /* 2 */ /* 终点位置为(8,8) */
0,1,1,1,1,0,0,1,1,0, /* 3 */ /* 2为走过的路 */
0,1,0,0,0,1,1,1,1,0, /* 4 */ /* 3为走了不能通过的死路 */
0,1,1,1,0,1,1,1,1,0, /* 5 */
0,1,0,1,1,1,0,1,1,0, /* 6 */
0,1,0,0,0,1,0,0,1,0, /* 7 */
0,0,1,1,1,1,1,1,1,0, /* 8 */
0,0,0,0,0,0,0,0,0,0}; /* 9 */
typedef struct{
int x;
int y;}postype;/* 迷宫块的坐标 */
typedef struct{ /* 迷宫块各参数 */
postype seat;/* 通道块在路径上的坐标 */
int direction;}mazepiece;
/* ------------定义栈的结构体------------- */
typedef struct{
mazepiece *base;
mazepiece *top;
int stacksize;}sqstack;
void initgr(void)
{
int gd=DETECT,gm=0;
registerbgidriver(EGAVGA_driver);
initgraph(&gd,&gm,"");
}
box(int x1,int y1,int x2,int y2,int color)/* 7为白色,4为红色 */
{
int i,j,nowcolor;
nowcolor=getcolor();
for (i=0;i<=y2-y1;i++)
{
setwritemode(1);
setcolor(color);
line(x1,y1+i,x2,y1+i);
}
setcolor(nowcolor);
setwritemode(0);
}
/* -----------栈的初始化----------------- */
initstack(sqstack *s)
{
s->base=(mazepiece *)malloc(100*sizeof(mazepiece));
if(!s->base)
exit();
s->top=s->base;
s->stacksize=100;
}
/* ------------求当前栈的长度----------- */
int length(sqstack *s)
{
return s->top-s->base;
}
/* --------------把元素e压入栈中------------------ */
push(sqstack *s,mazepiece e)
{
if(length(s)>=s->stacksize)
{
s->base=(mazepiece *)realloc(s->base,(s->stacksize+10)*sizeof(mazepiece));
if(!s->base) exit();
s->top=s->base+s->stacksize;
/* 为下一次插入作准备,下一次插入的时候不会出现错误追加空间 */
s->stacksize+=10;
}
*s->top=e;
s->top++;
}
/* -----------弹出当前栈顶元素------------- */
mazepiece pop(sqstack *s)
{
mazepiece e;
if(s->top==s->base) exit();
e=*(--s->top);
return e;
}
/* ---------走过的路留下”脚印“----------------- */
void footprint(postype a)
{
maze[a.x][a.y]=2;
}
postype nextpos(postype c,int di)
{ /* 根据当前位置及移动方向,返回下一位置 */
postype direc[4]={{0,1},{1,0},{0,-1},{-1,0}}; /* {行增量,列增量} */
/* 移动方向,依次为东南西北 */
c.x+=direc[di].x;
c.y+=direc[di].y;
return c;
}