SDUT3474->汤圆の拯救计划

汤圆の拯救计划

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description


又到了汤圆星球一年一度的汤圆节了,但是大魔王却过来把汤圆公主抓走了Σ( ° △ °|||)︴

身为汤圆骑士的QAQ蒟蒻自然而然的肩负着拯救汤圆的使命

QAQ蒟蒻经历了千辛万苦(并没有)之后,来到了大魔王的城堡,根据情报,汤圆公主就被大魔王放在城堡内,然后QAQ蒟蒻发现自己是一个路

痴,所幸的是他拿到了大魔王的城堡的地图,而且在这上面标注了自己和汤圆公主的位置,那么问题来了,聪明的你能帮他计算出需要多少单位

的时间来赶到汤圆公主的位置吗?


Ps:QAQ蒟蒻每一次都可以移动到相邻的非墙的格子中,每次移动都要花费1个单位的时间

有公共边的格子定义为相邻

Input

一开始为一个整数T代表一共有T组数据

每组测试数据的第一行有两个整数n,m (2<=n,m<=300)

接下来的n行m列为大魔王的迷宫,其中

’#’为墙壁,‘_‘为地面

A代表QAQ蒟蒻,O代表汤圆公主:

Output

一组数据输出一个整数代表从QAQ蒟蒻到汤圆的位置的最短时间

如果QAQ蒟蒻不能到达汤圆的位置,输出-1

Sample Input

2
3 3
__A
_##
__O
2 2
A#
#O

Sample Output

6
-1

Hint

Source

QAsQ


#include<bits/stdc++.h>
using namespace std;
bool mp[301][301];           //mp标记该点可不可走
bool book[301][301];        //这个题不用book标记会超时
int n,m,start_x,start_y,end_x,end_y;
struct node
{
    int x,y,n;     //x,y为坐标,n为走的最短时间
};

void bfs()
{
    int next[4][2]= {{0,1},{0,-1},{1,0},{-1,0}};//下一步可能的走法
    queue <node> q;
    node p,r;                   // 定义两个结构体,这是为了方便起见,最后输出的是r.n,请读者好好思考
    p.x=start_x,p.y=start_y;     //start_x,start_y为出发点
    p.n=0;                      //初始时间为0
    q.push(p);                   //先让p入队列,注意队列时结构体的队列
    book[start_x][start_y]=1;    //先让book标记好初始位置,表示已经走过
    while(!q.empty())            //只要队列不空
    {
        p=q.front();            //取队列的最前面一个,也就是最先入队列的那个,以后一样如此,依次便利
        q.pop();                  //取完了后让他出队

        for(int k=0; k<4; k++)   //枚举4种路径
        {
            r.x=p.x+next[k][0];
            r.y=p.y+next[k][1];
            r.n=p.n+1;
            if(r.x==end_x&&r.y==end_y)
            {
                cout<<r.n<<endl;
                return ;           // 找到后结束函数即可
            }
            if(book[r.x][r.y]==0&&mp[r.x][r.y]==0&&r.x>=0&&r.x<n&&r.y>=0&&r.y<m)  //判断可走性
            {
                book[r.x][r.y]=1;   //走完此步标记此步book为1,mp为0,这是广度优先搜索,所以不用再复位,请读者好好思考
                mp[r.x][r.y]=0;
                q.push(r);         //只要这个可走就入队,以后依次枚举,最先找到汤圆的极为最小时间,这就是深度优先搜索的魅力所在
            }
        }
    }
    cout<<"-1"<<endl;     //到最后都没找到在这里输出-1即可
}
int main()
{
    char ch;
    int t;
    cin>>t;
    while(t--)
    {
        memset(mp,0,sizeof(mp));
        memset(book,0,sizeof(book));
        cin>>n>>m;
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<m; j++)
            {
                cin>>ch;
                if(ch=='A')
                    start_x=i,start_y=j;
                else if(ch=='O')
                    end_x=i,end_y=j;
                else if(ch=='_')
                    mp[i][j]=0;
                else
                    mp[i][j]=1;
            }
        }
        bfs();
    }
    return 0;
}

/***************************************************
User name: ACM18171信科1801张林
Result: Accepted
Take time: 24ms
Take Memory: 332KB
Submit time: 2019-01-05 17:11:19
****************************************************/

猜你喜欢

转载自blog.csdn.net/weixin_43824158/article/details/85861125
今日推荐