找朋友 Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

X,作为户外运动的忠实爱好者,总是不想呆在家里。现在,他想把死宅Y从家里拉出来。问从X的家到Y的家的最短时间是多少。

为了简化问题,我们把地图抽象为n*m的矩阵,行编号从上到下为1 到 n,列编号从左到右为1 到 m。矩阵中’X’表示X所在的初始坐标,’Y’表示Y的位置 , ’#’表示当前位置不能走,’ * ’表示当前位置可以通行。X每次只能向上下左右的相邻的 ’*’ 移动,每移动一次耗时1秒。

Input

多组输入。每组测试数据首先输入两个整数n,m(1<= n ,m<=15 )表示地图大小。接下来的n 行,每行m个字符。保证输入数据合法。

Output

若X可以到达Y的家,输出最少时间,否则输出 -1。

Sample Input

3 3
X#Y
***
#*#
3 3
X#Y
*#*
#*#

Sample Output

4
-1

Hint

Source

zmx

AC代码(简单bfs)

#include <bits/stdc++.h>
#include <iostream>
using namespace std;
struct node
{
    int x, y;
    int step;
} f, s;
char mp[30][30];
int  vis[30][30], n, m;
int nxt[5][3] = {{0,1},{0,-1},{1,0},{-1,0}};
void bfs(int i, int j)
{
    queue<node>q;
    s.x = i, s.y = j, s.step = 0;
    vis[i][j] = 1;
    q.push(s);
    while(!q.empty())
    {
        s = q.front();
        q.pop();
        if(mp[s.x][s.y]=='Y')
        {
            printf("%d\n",s.step);
            return;
        }
        for(i = 0; i<4; i++)
        {
            f.x = s.x+nxt[i][0];
            f.y = s.y+nxt[i][1];
            if(f.x>=0&&f.x<n&&f.y>=0&&f.y<m&&mp[f.x][f.y]!='#'&&!vis[f.x][f.y])
            {
                f.step = s.step+1;
                q.push(f);
                vis[f.x][f.y] = 1;
            }
        }
    }
    printf("-1\n");
    return;
}
int main()
{
    int i, j;
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        getchar();
        memset(vis, 0, sizeof(vis));
        for(i = 0; i<n; i++)
        {
            cin>>mp[i];
        }
        for(i = 0; i<n; i++)
        {
            for(j = 0; j<m; j++)
            {
                if(mp[i][j]=='X')
                {
                   break;
                }
            }
            if(j<m)
                break;
        }
        bfs(i, j);
    }
    return 0;
}


/***************************************************
Result: Accepted
Take time: 0ms
Take Memory: 200KB
****************************************************/

猜你喜欢

转载自blog.csdn.net/qq_41524782/article/details/81636887