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\n",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;

                     }

              }

       }

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM