求大神帮忙写一个求解迷宫的程序,用栈实现就可以
求解迷宫,用栈实现,最后输出路线坐标和方向就好
程序代码:#include"List.h"
#include<windows.h>
#include<conio.h>
#ifndef MAXSIZE
#define MAXSIZE 10 //迷宫的最大长度
#endif
typedef char MAP; //自定义迷宫地图
typedef enum Visit
{
DISCOVER,
COVER,
}Visit;
typedef enum DIRECTION //枚举四个方向
{
UP,
DOWN,
LEFT,
RIGHT,
}DIRECTION;
typedef struct Point //定义坐标对
{
int x; //横坐标
int y; //纵坐标
}Point;
typedef struct Graph //储存迷宫地图结构体
{
Visit visit[sizeof(DISCOVER)];
Visit visit_This;
MAP data; //记录储存数据
}Graph;
typedef struct Maze //迷宫信息
{
Point start; //起点坐标
Point end; //终点坐标
int d;
Graph graph[MAXSIZE][MAXSIZE]; //迷宫结构信息
}Maze,*PMaze;
typedef int MAZE_MOVE(PMaze maze,Point* point); //自定义变量
void Maze_Init(PMaze maze,MAP map[][MAXSIZE+1]); //初始化迷宫
void Maze_Print(PMaze maze); //打印迷宫
void Maze_Print_Road(PList p,PMaze maze); //打印路
void Maze_Find_Road(PMaze maze); //寻找迷宫出口路径
MAZE_MOVE Maze_Move_Up; //对四个方向的移动进行判断
MAZE_MOVE Maze_Move_Down;
MAZE_MOVE Maze_Move_Left;
MAZE_MOVE Maze_Move_Right;
MAZE_MOVE Maze_Judge_Win; //判断是否找到终点
void Print_COM(void* p); //自定义打印函数
int main()
{
Maze maze={0};
MAP map[MAXSIZE][MAXSIZE+1]=
{
{"**********"},
{"* ** *"},
{"* *** ** *"},
{"* ** * *"},
{"* ** * *"},
{"* ** * *"},
{"* ** *"},
{"* ****** *"},
{"* ***** *"},
{"**********"},
};
system("cls");
Maze_Init(&maze,map);
Maze_Print(&maze);
Maze_Find_Road(&maze);
return 0;
}
void Maze_Init(PMaze maze,MAP map[][MAXSIZE+1]) //初始化迷宫
{
int i=0;
int j=0;
int k=0;
maze->start.x=1; //初始化起点坐标
maze->start.y=1;
maze->end.x=8; //初始化终点坐标
maze->end.y=8;
maze->d=sizeof(DISCOVER);
for (i=0;i<MAXSIZE;++i)
for (j=0;j<MAXSIZE;++j)
{
maze->graph[i][j].data=map[i][j];
for (k=0;k<maze->d;++k)
maze->graph[i][j].visit[k]=DISCOVER;
maze->graph[i][j].visit_This=DISCOVER; //表示该格没有走过
}
}
void Maze_Print(PMaze maze)
{
int i=0;
int j=0;
for (i=0;i<MAXSIZE;++i)
{
for (j=0;j<MAXSIZE;++j)
putchar(maze->graph[i][j].data);
puts("");
}
}
void Maze_Find_Road(PMaze maze) //寻找迷宫出口路径
{
PList p=NULL;
Point point= //获取起点坐标
{
maze->start.x,
maze->start.y,
};
MAZE_MOVE *move[sizeof(DISCOVER)]={0}; //定义四个方向的指针函数数组
int win=0; //判断是否有出口
move[UP]=Maze_Move_Up;
move[DOWN]=Maze_Move_Down;
move[LEFT]=Maze_Move_Left;
move[RIGHT]=Maze_Move_Right;
List_Fun.Creat_Link(&p,&point,sizeof(Point)); //创建一个栈
List_Fun.Insert_Rear(p,&point); //起始坐标入栈
maze->graph[point.x][point.y].visit_This=COVER; //标记此坐标被遍历过
printf("起点坐标:(%d,%d)\n",point.x,point.y);
printf("终点坐标:(%d,%d)\n",maze->end.x,maze->end.y);
while (!List_Fun.Empty_List(p))
{
int i=0;
int len=sizeof(DISCOVER);
for (i=0;i<len;++i)
{
if (move[i](maze,&point)&&((win=Maze_Judge_Win(maze,&point))==0))
{
List_Fun.Insert_Rear(p,&point); //入栈
i=-1;
//对新位置重新判断
}
if (win==1)
{
List_Fun.Insert_Rear(p,&point);
break;
}
}
if (win==1)
{
puts("深度搜索路线如下:");
List_Fun.Println_List(p,Print_COM); //输出链表数据
break;
}
List_Fun.Del_Rear(p,&point); //出栈
}
if (List_Fun.Empty_List(p))
puts("找不到出口!");
else
printf("共走了%d步\n",p->length);
while (!List_Fun.Empty_List(p))
{
List_Fun.Remove_Front(p,&point);
maze->graph[point.x][point.y].data='o';
}
if (win)
{
puts("请按任意键输出迷宫路线:");
getch();
Maze_Print(maze);
}
List_Fun.Del_List(&p,1); //释放栈
}
int Maze_Move_Up(PMaze maze,Point* point) //自定义变量
{
if (maze->graph[point->x][point->y].visit[UP]==COVER)
return 0;
if (point->x-1<0||maze->graph[point->x-1][point->y].data=='*')
return 0;
maze->graph[point->x][point->y].visit[UP]=COVER;
maze->graph[point->x][point->y].visit_This=COVER;
--point->x;
maze->graph[point->x][point->y].visit[DOWN]=COVER; //对返回路径进行处理
return 1;
}
int Maze_Move_Down(PMaze maze,Point* point) //自定义变量
{
if (maze->graph[point->x][point->y].visit[DOWN]==COVER)
return 0;
if (point->x+1>MAXSIZE-1||maze->graph[point->x+1][point->y].data=='*'||maze->graph[point->x+1][point->y].visit_This==COVER)
return 0;
maze->graph[point->x][point->y].visit[DOWN]=COVER;
maze->graph[point->x][point->y].visit_This=COVER;
++point->x;
maze->graph[point->x][point->y].visit[UP]=COVER;
return 1;
}
int Maze_Move_Left(PMaze maze,Point* point) //自定义变量
{
if (maze->graph[point->x][point->y].visit[LEFT]==COVER)
return 0;
if (point->y-1<0||maze->graph[point->x][point->y-1].data=='*'||maze->graph[point->x][point->y-1].visit_This==COVER)
return 0;
maze->graph[point->x][point->y].visit[LEFT]=COVER;
maze->graph[point->x][point->y].visit_This=COVER;
--point->y;
maze->graph[point->x][point->y].visit[RIGHT]=COVER;
return 1;
}
int Maze_Move_Right(PMaze maze,Point* point) //自定义变量
{
if (maze->graph[point->x][point->y].visit[RIGHT]==COVER)
return 0;
if (point->y+1>MAXSIZE-1||maze->graph[point->x][point->y+1].data=='*'||maze->graph[point->x][point->y+1].visit_This==COVER)
return 0;
maze->graph[point->x][point->y].visit[RIGHT]=COVER;
maze->graph[point->x][point->y].visit_This=COVER;
++point->y;
maze->graph[point->x][point->y].visit[LEFT]=COVER;
return 1;
}
int Maze_Judge_Win(PMaze maze,Point* point) //自定义变量
{
if (maze->end.x==point->x&&maze->end.y==point->y)
{
return 1;
}
return 0;
}
void Print_COM(void* p) //自定义打印函数
{
int x=((Point* )p)->x;
int y=((Point* )p)->y;
printf("%-4d%-4d\n",x,y);
}[此贴子已经被作者于2017-6-4 21:55编辑过]
