迷宫算法
BFS广度优先搜寻迷宫最短路径。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/* Sample Input: 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 Sample Output: (0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4) (4, 4) */ #include <stdio.h> #include <string.h> #define MAX 5 int maze[MAX][MAX]; int q[MAX*MAX]; int fa[MAX][MAX]; void BFS(int x,int y){ int vsit[MAX][MAX]; int front=0,rear=0,u;//队列头尾 int dist[MAX][MAX];//父亲,距离数组 int dx[4],dy[4]; dx[0]=-1;dy[0]=0; dx[1]=1; dy[1]=0; dx[2]=0 ;dy[2]=-1; dx[3]=0 ;dy[3]=1; for(int i=0;i<MAX;i++) for(int j=0;j<MAX;j++) vsit[i][j]=0; u=x*MAX+y; fa[x][y]=u; dist[x][y]=0; q[rear++]=u; vsit[x][y]=1;//表示已被访问过 while(front<rear){ u=q[front++]; x=u/MAX; y=u%MAX; for(int d=0;d<4;d++){ int nx=x+dx[d]; int ny=y+dy[d]; if(nx>=0&&ny>=0&&nx<MAX&&ny<MAX&&!maze[nx][ny]&&!vsit[nx][ny]){ int v=nx*MAX+ny; q[rear++]=v; dist[nx][ny]=dist[x][y]; vsit[nx][ny]=1; fa[nx][ny]=u; } } } } void Print_path(int x,int y){ int a=fa[x][y]/MAX; int b=fa[x][y]%MAX; if(a!=x||b!=y) Print_path(a,b); printf("(%d, %d)\n",x,y); } int main(){ for(int i=0;i<5;i++) for(int j=0;j<5;j++) scanf("%d",maze[i]+j); BFS(0,0); Print_path(MAX-1,MAX-1); return 0; }