迷宫问题(数据结构)

#include
#include
#include
#include
#include
#include "LBDL.h"//链表队列

//墙或通路及前进方向符号定义
#define WALL 0 //代表当前格子是墙
#define PATH 1 //代表是通路且未走过
#define RIGHT -1 //代表是通路且从其向右走
#define DOWN -2 //代表是通路且从其向下走
#define LEFT -3 //代表是通路且从其向左走
#define UP -4 //代表是通路且从其向上走
#define ZS -5 //左上
#define ZX -6 //左下
#define YS -7 //右上
#define YX -8 //右下
#define BACK -9 //代表是通路且从其后退一步
#define DESTINATION -10 //代表当前格子是通路且是目标位置


typedef int MazeType[10][10]; //最外凿初始化成墙,实际含8*8个格子
typedef int Status;
typedef int ElemType; //迷宫数组中的元素类型

//------------------- 迷宫求解的具体算法 ------------------//

Status MakeMaze(MazeType maze)
{
//生成迷宫,0 表示通PATH, 1 表示不通WALL
PosType m;
srand(time(NULL)); //随机数的产生n=rand()%(Y-X+1)+X; /*n为X~Y之间的随机数*/
for(m.y = 0;m.y<=9;m.y++)
{
maze[0][m.y] = WALL;
maze[9][m.y] = WALL;
}
for(m.x = 0;m.x<=9;m.x++)
{
maze[m.x][0] = WALL;
maze[m.x][9] = WALL;
}

for(m.x = 1;m.x<9;m.x++)
for(m.y = 1;m.y<9;m.y++)
maze[m.x][m.y] = rand()%2;
/*随机数取到0到RAND_MAX之间的任何数,
对2取余数只产生0,1
//rand()%(1-0+1)+0;*/
return OK;
}

//打印迷宫,使其成为一幅图
void PrintMaze(MazeType maze)
{
int x,y;
printf(" ");
for(x=0;x<=9;x++)
printf(" %d",x);
printf("\n");
for(x=0;x<=9;x++)
{
printf("%d",x);
for(y=0;y<=9;y++)
{
switch(maze[x][y])
{
case WALL:
printf("■"); break;
case PATH:
printf(" "); break;
case RIGHT:
printf("→"); break;
case DOWN:
printf("↓"); break;
case LEFT:
printf("←"); break;
case UP:
printf("↑"); break;
case ZS:
printf("↖"); break;
case ZX:
printf("↙"); break;
case YS:
printf("↗"); break;
case YX:
printf("↘"); break;
case BACK:
printf("·"); break;
case DESTINATION:
printf("◎"); break;
default:
printf("错误!\n");
exit(-1);
}
}
printf("\n");
}
}

//位置的移动
PosType Nextpos(PosType position,ElemType direction)
{
//移动到下一格,向下走一步
PosType spot;
spot = position;
switch(direction)
{
case 1:
spot.y++; break;//向右
case 2:
spot.x++; break;//向下走
case 3:
spot.y--; break;//向左
case 4:
spot.x--; break;//向上
case 5:
spot.x--; spot.y--; break;//左上
case 6:
spot.x++; spot.y--; break;//左下
case 7:
spot.x--; spot.y++; break;//右上


case 8:
spot.x++; spot.y++; break;//右下
}
return spot;
}

//开始自动寻找路口
Status PassMaze(MazeType maze,PosType start,PosType end,LinkQueue * Q)
{
//找出迷宫的一条通路
PosType pos;
QElemType e;
int step = 1;
pos = start;
if(maze[pos.x][pos.y] != PATH)
{
printf("当前迷宫没有入口\n");
return FALSE;
}
do{
//printf("第%d步pso的位置(%d,%d)\n",step,pos.x,pos.y);
if(maze[pos.x][pos.y]==PATH) //当前位置可通
{
e.ord = step; //走过的第几步
e.seat = pos; //在迷宫的位置
e.di = 1; //将要往右走
EnQueue(Q,e); //将坐标入队插入队尾
//printf("1第%d步,坐标(%d ,%d),下一步的方向:%d\n",e.ord,e.seat.x,e.seat.y,e.di);
if(pos.x == end.x && pos.y == end.y)
{
printf("到达迷宫出口(%d,%d)\n",pos.x,pos.y);
maze[pos.x][pos.y] = DESTINATION; //到达迷宫出口
return OK;
}
else
{
maze[pos.x][pos.y] = RIGHT; //标志为向右走
pos = Nextpos(pos,1); //坐标向右移动一个格子
step++;
//printf("移动的第%d步,坐标(%d ,%d),下一步的方向:%d\n",e.ord,e.seat.x,e.seat.y,e.di);
}
}
else
{
GetRear(Q,&e); //返回队尾元素
//printf("2第%d步,坐标(%d ,%d),下一步的方向:%d\n",e.ord,e.seat.x,e.seat.y,e.di);
while(!QueueEmpty(Q) && e.di == 8)
{
//printf("w4第%d步,坐标(%d ,%d),下一步的方向:%d\n",e.ord,e.seat.x,e.seat.y,e.di);
maze[e.seat.x][e.seat.y] = BACK; //标志为返回
DeRear(Q,&e); //将插入队尾的元素弹出
step--;
if(QueueEmpty(Q))
break;
GetRear(Q,&e); //取出队尾元素
}

if(e.di<8)
{
DeRear(Q,&e); //弹出队尾元素
e.di++;
//printf("3第%d步,坐标(%d ,%d),下一步的方向:%d\n",e.ord,e.seat.x,e.seat.y,e.di);
EnQueue(Q,e); //将新结点插入队尾
//printf("新的第%d步,坐标(%d ,%d),下一步的方向:%d\n",e.ord,e.seat.x,e.seat.y,e.di);
maze[e.seat.x][e.seat.y] = -e.di;//前进方向与e.di相反
pos = Nextpos(e.seat,e.di);
//printf("第%d步pso的位置(%d,%d)\n",step,pos.x,pos.y);
}
}
}while(!QueueEmpty(Q));
return FALSE;
}

//Status Traverse(LinkQueue Q,

void main()
{
MazeType maze;
PosType start,end;
LinkQueue Q;

InitQueue(&Q);
MakeMaze(maze);
printf("初始迷宫:\n");
PrintMaze(maze);
printf("输入迷宫的入口位置坐标从(0,0)到(9,9):");
scanf("%d,%d",&start.x,&start.y);
printf("输入迷宫的出口位置坐标从(0,0)到(9,9):");
scanf("%d,%d",&end.x,&end.y);

if(PassMaze(maze,start,end,&Q))//找迷宫通路
{
printf("迷宫可通,路径踪迹如下:\n");
PrintMaze(maze); //输出走过之后的迷宫
printf("具体路径为:\n");
QueueTraverse(Q); //遍历队列的每个元素并输出
}
else
{
printf("迷宫不可

通,路径踪迹如下:");
PrintMaze(maze);
}
DestroyQueue(&Q); //销毁队列
printf("-------------输入任意键结束---------------\n");
getchar();

}

相关文档
最新文档