抄录自课本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);}