迷宫算法

BFS广度优先搜寻迷宫最短路径。

/*
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)
",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;
}
View Code
原文地址:https://www.cnblogs.com/JT-L/p/3657699.html