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;

                     }

              }

       }

}

原文地址:https://www.cnblogs.com/csgc0131123/p/5290324.html