【BFS】【Rqnoj34】紧急援救

题目描述

话说2007年8月5日,Mike博士神秘失踪了,最后发现是被外星人绑架了,幸好外星人目前还是在地球上活动,并且知道外星人不了解地球,幸好,Milk博士身上有无线信号发送 装置,我们终于确定了他的位置,必须赶快到那里去救他。 
根据无线信号发送装置,我们确定出一张地图,为了尽快寻找到Mike博士,于是这个光荣和艰巨的任务便交给了你,编写程序,通过使用一张地图帮助研究所确定从研究所出发找到 Mike博士最短距离。 
数据范围: n<=1000
输入格式

第一行为n
第二行为n*n的地图(其中0表示通路,1表示死路)
最后两行每行有两个数字,分别表示研究所的坐标和博士信号所在的位置。
输出格式

一个数字k,表示从研究所出发找到Milk博士的最短距离。


Sample Input
10
0100110100
0001110010
1000000001
1000100011
0000101100
1000001100
1001010011
0000010100
0101010000
1001000001
1 7
10 2

Sample Output
14

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <ctime>

#define mxn 1000+10
#define loc

using namespace std;

const int mx[4]={0,1,0,-1};
const int my[4]={1,0,-1,0};

int n;
int mp[mxn][mxn];
bool v[mxn][mxn];
int xs,ys,xt,yt;

struct Nd
{
       int x,y;
       int stp;
}q[mxn*100000];

char s[mxn];



int l,r;

bool ck(int x,int y)
{
     if (x>=1&&x<=n&&y>=1&&y<=n&&!v[x][y]&&!mp[x][y]) return 1;
     return 0;
}

void bfs()
{
     memset(q,0,sizeof(q));
     l=r=1;
     q[l].x=xs,q[l].y=ys,v[xs][ys]=true,q[l].stp=1;
     
     while (l<=r)
     {
           for (int i=0;i<4;++i)
           {
               int X=q[l].x+mx[i],Y=q[l].y+my[i];
               
               if (X==xt&&Y==yt)
               {
                                printf("%d",q[l].stp); 
                                exit(0);
               }
               
               if (ck(X,Y))
               {
                           v[X][Y]=true;
                           q[++r].x=X,q[r].y=Y;
                           q[r].stp=q[l].stp+1;
               }
               
           }
           
           l++;
     }

}

int main()
{
    #ifdef loc
    freopen("rescue.in","r",stdin);
    freopen("rescue.out","w",stdout);
    #endif
    
    scanf("%d",&n); 
    for (int i=1;i<=n;++i)
    {
        scanf("%s",s);
        for (int j=0;j<n;++j)
        {
            if (s[j]=='0') mp[i][j+1]=0;
            else mp[i][j+1]=1;
        }
    }   
    scanf("%d%d%d%d",&xs,&ys,&xt,&yt);  
    
    bfs();
    
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值