找朋友(bfs)

F - 找朋友
Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu

Description

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

Input

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

Output

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

Sample Input

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

Sample Output

4
-1

Hint

 
简单的bfs(广度优先搜索)。




#include <stdio.h>
#include <string.h>
char map[20][20];
char mv[20][20];
struct node
{
    int x;
    int y;
    int ans;
}q[300],t,f;
int jx[]={0,-1,0,1};
int jy[]={1,0,-1,0};
int n,m;
void bfs(int x,int y)
{

    int i;
    int s=0,e=0;
    t.x=x;
    t.y=y;
    t.ans=0;
    q[e++]=t;
    mv[t.x][t.y]=1;
    while (s<e)
    {
        t=q[s++];
        if(map[t.x][t.y]=='Y')
        {
            printf("%d\n",t.ans);
            return ;
        }
        for(i=0;i<4;++i)
        {
            f.x=t.x+jx[i];
            f.y=t.y+jy[i];
            if(f.x>=0&&f.x<n&&f.y>=0&&f.y<m&&mv[f.x][f.y]==0&&map[f.x][f.y]!='#')
                {
                    f.ans=t.ans+1;
            q[e++]=f;
            mv[f.x][f.y]=1;
                }
        }
    }
    printf("-1\n");
    return ;
}
int main()
{
    int i,j;
    while (scanf("%d %d",&n,&m)!=EOF)
    {
        memset (mv,0,sizeof(mv));
        for(i=0;i<n;i++)
        {
            scanf("%s",&map[i]);

        }
        for(i=0;i<n;i++)
            {
                for(j=0;j<m;j++)
        {
            if(map[i][j]=='X')
                break;
        }
        if(j!=m)
            break;
            }
            bfs(i,j);
    }
    return 0;
}

    

发布了608 篇原创文章 · 获赞 5946 · 访问量 91万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 酷酷鲨 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览