抄录自课本P157页。
#include <stdio.h>
#define MAXQ 100 // 队列大小
#define MAxN 10 // 最大迷宫大小
int n=8; // 迷宫大小
char Maze [MAxN][MAxN]=
{
{'O','X','X','X','X','X','X','X',},
{'O','O','O','X','O','X','O','X',},
{'X','X','O','O','O','X','O','X',},
{'X','X','O','X','O','X','X','X',},
{'X','X','O','X','O','X','O','X',},
{'X','X','O','X','O','X','O','X',},
{'X','X','O','O','O','O','O','X',},
{'X','X','O','X','O','X','O','O',},
};
int H[4]= {0,1,0,-1}; // 水平偏移量,下标对应方位号 0~4
int V[4]= {-1,0,1,0}; // 垂直偏移量
struct Position
{
int x,y; // 当前方块位置
int pre; // 前驱方块的下标
};
Position qu[MAXQ]; // 一个队列
int front =-1,rear=-1; // 队头,队尾
void dispath(int front)
{
int i,j;
for(i=0; i<n; i++)
for(j=0; j<n; j++)
if(Maze[i][j]=='*')
Maze[i][j]=='O';
int k= front;
while(k!=-1)
{
Maze[qu[k].x][qu[k].y]=' ';
k=qu[k].pre;
}
for(i=0; i<n; i++)
{
printf(" ");
for(int j=0; j<n; j++)
printf("%c",Maze[i][j]);
printf("\n");
}
}
void BFS(int x,int y)
{
Position p,p1,p2;
p.x=x;
p.y=y;
p.pre=-1; // 入口节点
Maze[p.x][p.y]='*'; // 改为'*' 避免重复查找
rear++;
qu[rear]=p; // 入口方块入队
while(front!=rear) // 队列不空时循环
{
front++;
p1=qu[front]; // 出队方块
if(p1.x==n-1&&p1.y==n-1) // 找到出口
{
dispath(front); // 输出路径
return;
}
for(int k=0; k<4; k++)
{
p2.x=p1.x+V[k]; // 找到 p1 的相邻方块
p2.y=p1.y+H[k];
if(p2.x>=0&&p2.y>=0&&p2.x<n&&p2.y<n&&Maze[p2.x][p2.y]=='O') // 方块 2 没有越界并且可走
{
Maze[p2.x][p2.y]='*'; // 改为‘*’避免重复查找
p2.pre=front;
rear++;
qu[rear]=p2; // 方块 2 进队
}
}
}
}
int main()
{
int x=0,y=0; // 指定入口,出口默认为 (n-1,n-1)
printf("一条迷宫路径:\n");
BFS(x,y);
}