迷宫~哈哈~终于懂了BFS

输入m,n表示m*n的迷宫,接下来m*n行表示迷宫,用1表示路,0表示墙。输出左上角到右上角最少步数及走法.

输入:

5 5

1 0 1 1 1

1 0 1 0 1

1 0 1 0 1

1 1 1 1 1

1 0 0 1 1

输出:

minimum steps:8

<0,0><1,0><2,0><3,0><3,1><3,2><2,2><1,2><0,2><0,3><0,4>

 

核心在于BFS 

在走迷宫时,其重要在于一层一层走并记录每层的最短距离下面用dist[x][y]表示,而x*n+y就是标号[x][y]的编号,用fa[x][y]记录它父节点的编号

dx[4]与dy[4]用于向四周搜索,用vis[x][y]记录是否走过。代码如下:

#include<stdio.h>
#include<string.h>
int a[110][110],vis[110][110]={0},fa[110][110];
int dist[110][110];int dx[4]={0,-1,0,1},dy[4]={-1,0,1,0};
int q[110*110];
int m,n;
int key=1;
void bfs(int x,int y)
{
    memset(vis,0,sizeof(vis));memset(fa,0,sizeof(fa));
    memset(dist,0,sizeof(dist));memset(q,0,sizeof(q));
    int u=x*n+y;fa[x][y]=u;
    vis[x][y]=1;dist[x][y]=0;
    int front=0,rear=1;
    q[front]=u;
    while(front<rear)
    {
        u=q[front++];
        int x=u/n,y=u%n;
        for(int i=0;i<4;i++)
        {
            int nx=x+dx[i],ny=y+dy[i];
            if(!vis[nx][ny]&&a[nx][ny]&&nx>=0&&nx<m&&ny>=0&&ny<n)
            {
                vis[nx][ny]=1;
                int v=nx*n+ny;
                q[rear++]=v;
                dist[nx][ny]=dist[x][y]+1;
                fa[nx][ny]=u;
            }
        }
    }
}
void print(int x,int y)
{
    if(!x&&!y)
    {
        printf("minimum steps:%d\n",dist[m-1][n-1]);
        printf("<%d,%d>",x,y);
    }
    else{
        int a=fa[x][y]/n,b=fa[x][y]%n;
        print(a,b);
        printf("<%d,%d>",x,y);
    }
}
void printt()
{
    printf("Case %d:\n",key++);
    for(int i=0;i<m;i++)
        for(int j=0;j<n;j++)
            printf("%d%c",a[i][j],j==n-1?'\n':' ');
}
int main()
{
//    freopen("in.txt","r",stdin);
    while(~scanf("%d%d",&m,&n))
    {
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
                scanf("%d",&a[i][j]);
        bfs(0,0);
//        printt();
        print(m-1,n-1);
        printf("\n\n");
    }
    return 0;
}

 

posted @ 2012-12-27 13:34  再见~雨泉  阅读(248)  评论(0编辑  收藏  举报