/*------------------------------------------------------------------------
程序说明:迷宫求解
用栈实现迷宫寻找一条可行的路径
---------------------------------------------------------------------*/
/*----------------------------------------------------------------------
文件:useMaze.c
功能:提供测试代码
------------------------------------------------------------------*/
#include<stdio.h>
#include"maze.h"
int main(void)
{
MazeType Maze[MAX][MAX] ;
PosType start ,end ;
InitMaze(Maze) ; //初始化迷宫
InitStartEnd(&start,&end) ; //初始化入口出口
printf("\n\n\n\n") ;
if(MazePath(Maze,start,end))
{
puts("能找到一条路径到出口") ;
}
else
{
puts("不能找到一条路径到出口") ;
}
return 0 ;
}
/*----------------------------------------------------------
文件:maze.h
功能:提供函数声明以及一些常量标识符、类型定义
--------------------------------------------------------*/
#ifndef MAZE_H_
#define MAZE_H_
/*--------------------------------------------------------*/
/*路径的一些标识*/
#define PASS 0
#define USE 1
#define BLOCK 2
#define DIE 3
#define MAX 5
#define ISPASS(Pos) (Pos.x >= 0 && Pos.x < MAX && Pos.y>= 0 && Pos.y < MAX && Maze[Pos.x][Pos.y] == PASS )
/*-----------------------------------------------------*/
/*--------------------------------------------------------*/
/*函数的一些返回值定义符*/
#define OK 1
#define FALSE 0
#define TRUE 1
#define OVERFLOW -1
#define ERROR 0
typedef int Status ;
/*-----------------------------------------------------*/
/*-----------------------------------------------------*/
/*一些类型的定义*/
typedef int MazeType ; //迷宫类型,二维整型数组实现
typedef struct { int x; int y;} PosType ; // 路径的坐标
typedef struct //关于每一块路径的信息
{
int ord ;
PosType seat ;
int di ;
} SElemType ;
typedef struct //栈
{
SElemType *base ;
SElemType *top ;
int stacksize ;
} MazeStack ;
#define STACK_ININ_SIZE 100
#define STACKINCREMENT 10
/*-----------------------------------------------------*/
/*-----------------------------------------------------*/
//fuction defined
void InitStartEnd(PosType *start,PosType *end) ;//InitStartEnd
Status DestoryStack(MazeStack *S) ; //DestoryStack
Status Push(MazeStack *S,SElemType e) ; //Push
Status Pop(MazeStack *S, SElemType *e) ;//Pop
Status StackEmpty(MazeStack S) ;//StackEmpty
void MarkPrint(PosType P , MazeType (*Maze)[MAX]); //MarkPrint
PosType NextPos(PosType *P, int d) ;//NextPos
void FootPrint(const PosType Pos,MazeType (*Maze)[MAX]) ;//FootPrint
Status Pass(const PosType Pos,MazeType (*Maze)[MAX]); //Pass
Status InitStack(MazeStack *S) ;//InitStack
void PrintMaze(MazeType (*Maze)[MAX]); //PrintMaze
void InitMaze(MazeType (*Maze)[MAX]); //InitMaze
Status MazePath(MazeType (*Maze)[MAX],PosType start,PosType end) ;//MazePath
/*-----------------------------------------------------*/
#endif
/*------------------------------------------------
文件:Maze.c
功能:提供接口的实现
----------------------------------------------*/
#include<stdio.h>
#include<stdlib.h> //提供realloc
#include"maze.h"
void InitStartEnd(PosType *start,PosType *end)
{
printf("请输入入口的横坐标: ") ;
scanf("%d",&(start->x )) ;
printf("请输入入口的纵坐标:") ;
scanf("%d",&(start->y )) ;
printf("请输入出口的横坐标: ") ;
scanf("%d",&(end->x )) ;
printf("请输入出口的纵坐标:") ;
scanf("%d",&(end->y )) ;
}//InitStartEnd
Status DestoryStack(MazeStack *S)
{
free(S->base) ;
S->base = S->top = NULL ;
return OK ;
}//DestoryStack
Status Push(MazeStack *S,SElemType e)
{
if(S->top -S->base >= S->stacksize )
{
S->base = (SElemType *)realloc(S->base ,(S->stacksize +STACKINCREMENT) * sizeof(SElemType)) ;
if(NULL == S->base )
{
puts("ERROR") ;
exit(OVERFLOW) ;
}
S->top = S->base + S->stacksize ;
S->stacksize += STACKINCREMENT ;
}
*(S->top )++ = e ;
return OK ;
}//Push
Status Pop(MazeStack *S, SElemType *e)
{
if(S->top == S->base )
return ERROR ;
*e = * --S->top ;
return OK ;
}//Pop
Status StackEmpty(MazeStack S)
{
return (S.base == S.top ) ;
}// StackEmpty
void MarkPrint(PosType P , MazeType (*Maze)[MAX]) //注意二维数组的地址是如何传递给函数的
{
Maze[P.x][P.y] = DIE ;
}//MarkPrint
PosType NextPos(PosType *P, int d)
{
switch(d)
{
case 1 : P->y++ ; break ;
case 2 : P->x++ ; break ;
case 3 : P->y-- ; break ;
case 4 : P->x-- ; break ;
}
return *P ;
} //NextPos
void FootPrint(const PosType Pos,MazeType (*Maze)[MAX])
{
//调试使用 printf(" x = %d,y = %d\n",Pos.x,Pos.y ) ;
Maze[Pos.x][Pos.y] = USE ;
}//FootPrint
Status Pass(const PosType Pos,MazeType (*Maze)[MAX])
{
return ISPASS(Pos) ;
}//Pass
Status InitStack(MazeStack *S)
{
S->base = (SElemType *) malloc(STACK_ININ_SIZE * sizeof(SElemType) ) ;
if(NULL == S->base)
{
puts("ERROR") ;
exit(OVERFLOW) ;
}
S->top = S->base ;
S->stacksize = STACK_ININ_SIZE ;
return OK ;
}//InitStack
void PrintMaze(MazeType (*Maze)[MAX])
{
int i = 0 ;
int j = 0 ;
printf("\n迷宫现状:\n") ;
printf("\n0代表通路、1代表走过、2代表墙壁、3代表死胡同\n") ;
for(i = 0 ; i < MAX ; i++)
{
for(j = 0 ; j < MAX ; j++)
{
printf("%2d",Maze[i][j]) ;
}
printf("\n") ;
}
}//PrintMaze
void InitMaze(MazeType (*Maze)[MAX])
{
int i = 0 ;
int j = 0 ;
printf("\n0代表通路、2代表墙壁\n") ;
for(i = 0 ; i < MAX ; i++)
{
for(j = 0 ; j < MAX ; j++)
Maze[i][j] = 2 ;
}
PrintMaze(Maze) ;
printf("\n0代表通路、2代表墙壁\n") ;
printf("请初始化迷宫:\n") ;
for(i = 0 ; i < MAX ; i++)
{
printf("请初始化第%d行: \n",i+1) ;
for(j = 0 ; j < MAX ; j++)
scanf("%d",&Maze[i][j]) ;
}
PrintMaze(Maze) ;
}//InitMaze
Status MazePath(MazeType (*Maze)[MAX],PosType start,PosType end)
{
SElemType e ;
MazeStack S ;
PosType curpos ;
int curstep ;
InitStack(&S) ; //初始化栈
curpos = start ; // start.x= start.y = 0
curstep = 1 ;
do
{
if(Pass(curpos,Maze))
{
FootPrint(curpos,Maze) ;
e.di = 1 ;
e.seat = curpos ;
e.ord = curstep ;
Push(&S,e) ;
if(curpos.x == end.x && curpos.y == end.y )
{
PrintMaze(Maze) ;
return TRUE ;
} //if
curpos = NextPos(&curpos,1) ;
curstep++ ;
} //if
else
{
if(!StackEmpty(S))
{
Pop(&S,&e) ;
while(e.di == 4 && !StackEmpty(S))
{
MarkPrint(e.seat,Maze) ;
Pop(&S,&e) ;
} //while
if(e.di <4)
{
e.di++ ;
Push(&S,e) ;
curpos = NextPos(&(e.seat) ,e.di) ;
} //if
} //if
} //else
}while(!StackEmpty(S)) ; //while
PrintMaze(Maze) ;
return FALSE ;
} // MazePath
数据结构的应用------------迷宫求解
最新推荐文章于 2023-04-02 21:14:02 发布