• 68.营救问题(广搜)



    营救

    【问题描述】

            铁塔尼号遇险了!他发出了求救信号。距离最近的哥伦比亚号收到了讯息,时间就是生命,必须尽快赶到那里。

            通过侦测,哥伦比亚号获取了一张海洋图。这张图将海洋部分分化成n*n个比较小的单位,其中用1标明的是陆地,用0标明是海洋。船只能从一个格子,移到相邻的四个格子。

           为了尽快赶到出事地点,哥伦比亚号最少需要走多远的距离。

    【输入格式】

    第一行为n,下面是一个n*n01矩阵,表示海洋地图

    最后一行为四个小于n的整数,分别表示哥伦比亚号和铁塔尼号的位置。

    【输出格式】

    哥伦比亚号到铁塔尼号的最短距离,答案精确到整数。

    【输入样例】save.in

    3

    001

    101

    100

    1 1 3 3

    【数据范围】

    N<=1000

    代码:

    2、营救

    【问题描述】

            铁塔尼号遇险了!他发出了求救信号。距离最近的哥伦比亚号收到了讯息,时间就是生命,必须尽快赶到那里。

            通过侦测,哥伦比亚号获取了一张海洋图。这张图将海洋部分分化成n*n个比较小的单位,其中用1标明的是陆地,用0标明是海洋。船只能从一个格子,移到相邻的四个格子。

           为了尽快赶到出事地点,哥伦比亚号最少需要走多远的距离。

    【输入格式】

    第一行为n,下面是一个n*n01矩阵,表示海洋地图

    最后一行为四个小于n的整数,分别表示哥伦比亚号和铁塔尼号的位置。

    【输出格式】

    哥伦比亚号到铁塔尼号的最短距离,答案精确到整数。

    【输入样例】save.in

    3

    001

    101

    100

    1 1 3 3

    【数据范围】

    N<=1000

    样例输入:

    In

    10

    0100110100

    0001110010

    1000000001

    1000100011

    0000101100

    1000001100

    1001010011

    0000010100

    0101010000

    1001000001

    1 7 10 2

    Out14

    In

     

    代码:

    #include

    using namespace std;

    #include

    int n,jz[1001][1001],xq,xz,yq,yz;

    int xx[]={0,0,1,-1};

    int yy[]={1,-1,0,0};

    int dis[1001][1001];

    int dl1[1001],dl2[1001];

    void BFS();

    int main()

    {

           scanf("%d",&n);

           char p[1001];

           for(int i=1;i<=n;++i)

         {

              scanf("%s",p+1);

             for(int j=1;j<=n;++j)

             {

                 if(p[j]=='0')

                 jz[i][j]=0;

                 if(p[j]=='1')

                 jz[i][j]=1;

             }

        }

           scanf("%d%d%d%d",&xq,&yq,&xz,&yz);

           BFS();

           printf("%d ",dis[xz][yz]);

           return 0;

    }

    void BFS()

    {

           int head=0,tail=1;

           dl1[tail]=xq;

           dl2[tail]=yq;

           dis[xq][yq]=0;

           while(head

           {

                  ++head;

                  int x1=dl1[head],y1=dl2[head];

                  for(int i=0;i<4;++i)

                  {

                         int x2=x1+xx[i],y2=y1+yy[i];

                         if(x2>=1&&x2<=n&&y2>=1&&y2<=n&&!jz[x2][y2])

                      {

                             jz[x2][y2]=1;

                             ++tail;

                             dis[x2][y2]=dis[x1][y1]+1;

                             dl1[tail]=x2;

                             dl2[tail]=y2;

                         }

                         if(dl1[tail]==xz&&dl2[tail]==yz)

                         {

                                head=tail;

                                break;

                         }

                  }

           }

    }

  • 相关阅读:
    Codeforces Round #696 (Div. 2) A
    软件体系结构期末复习
    LINUX 下配置 redis
    2020-09-30 刷题记录
    2020-09-29 刷题记录
    Codeforces Round #673 (Div. 2) A
    2020-09-26 刷题记录
    2020-09-25 刷题记录
    C++ 类虚函数实现原理的验证(指向包含类虚函数地址的数组的指针)
    Saleae8 与 SaleaeLogic、PulseView上位机的使用
  • 原文地址:https://www.cnblogs.com/csgc0131123/p/5290323.html
Copyright © 2020-2023  润新知