Openjudge 2.5 6264:走出迷宫

总时间限制: 
1000ms
 
内存限制: 
65536kB
描述

当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。 
假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。

输入
第一行是两个整数n和m(1<=n,m<=100),表示迷宫的行数和列数。
接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符'.'表示空地,'#'表示墙,'S'表示起点,'T'表示出口。
输出
输出从起点到出口最少需要走的步数。
样例输入
3 3
S#T
.#.
...
样例输出
6
bfs
屠龙宝刀点击就送

#include <iostream>
#include <cstdlib>

using namespace std;

int ax[4]={0,0,1,-1},ay[4]={1,-1,0,0},a,b,c,d,i,j,n,m;
char mg[101][101];
int print(int p)
{
    cout<<p<<endl;
    exit(0);
}
int ss()
{
    int head=0,tail=1,x,y,f[100*100][4];
    f[tail][1]=a;
    f[tail][2]=b;
    f[tail][3]=1;
    mg[a][b]='#';
    do{
        head++;
        for(i=0;i<4;++i)
        {
            x=f[head][1]+ax[i];y=f[head][2]+ay[i];
            if(x>=0&&x<m&&y>=0&&y<n&&mg[x][y]=='.')
            {
                tail++;
                f[tail][1]=x;
                f[tail][2]=y;
                f[tail][3]=f[head][3]+1;
                mg[x][y]='#';
                if(x==c&&y==d)
                {
                    print(f[head][3]);
                    break;
                }
            }
        }
    }while(head<tail);
}
int main()
{
    cin>>n>>m;
    for(i=0;i<n;++i)
    {
        for(j=0;j<m;++j)
        {
            cin>>mg[i][j];
            if(mg[i][j]=='S')
            {
                a=i;
                b=j;
                mg[i][j]='.';
            }
            if(mg[i][j]=='T')
            {
                c=i;
                d=j;
                mg[i][j]='.';
            }
        }
    }
    ss();
    return 0;
}

posted @ 2017-03-03 21:04  杀猪状元  阅读(718)  评论(0编辑  收藏  举报