【寬度優先搜尋BFS】營救
阿新 • • 發佈:2021-02-09
技術標籤:bfs
【寬度優先搜尋BFS】營救
題目描述
鐵塔尼號遇險了!他發出了求救訊號。距離最近的哥倫比亞號收到了訊息,時間就是生命,必須儘快趕到那裡。 通過偵測,哥倫比亞號獲取了一張海洋圖。這張圖將海洋部分分化成n*n個比較小的單位,其中用1標明的是陸地,用0標明是海洋。船隻能從一個格子,移到相鄰的四個格子。為了儘快趕到出事地點,哥倫比亞號最少需要走多遠的距離。
輸入
第一行為n,下面是一個n*n的0、1矩陣,表示海洋地圖
最後一行為四個小於n的整數,分別表示哥倫比亞號和鐵塔尼號的位置。
輸出
哥倫比亞號到鐵塔尼號的最短距離,答案精確到整數。
樣例輸入
3
001
101
100
1 1 3 3
樣例輸出
4
本題是一道寬搜題,難度並不是很大,一開始我思路正確,上下左右四個方向搜尋,直到終點就結束。可結果是:
我不停地除錯,差不離有半小時,結果發現數組開小了。。。。。。
程式碼如下
#include<iostream>
using namespace std;
char a[5001][5001];
int sum,mi;
int fx[4]={1,-1,0,0},fy[4]={0,0,1,-1},h[1000001][4];
int n,qx,qy,zx,zy;
int go(int x,int y)
{
int tail=1,head=0,xx,yy;
h[1][1]=x;
h[1][ 2]=y;
h[1][3]=0;
while(tail>head)
{
head++;
for(int i=0;i<4;i++)
{
xx=h[head][1]+fx[i];
yy=h[head][2]+fy[i];
if(xx==zx&&yy==zy)
{
cout<<h[head][3]+1;
exit(0);
}
if(xx>=1&&yy>=1&&xx<=n&&yy<=n&&a[xx][yy]=='0' )
{
tail++;
a[xx][yy]='1';
h[tail][1]=xx;
h[tail][2]=yy;
h[tail][3]=h[head][3]+1;
}
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cin>>a[i][j];
}
cin>>qx>>qy>>zx>>zy;
go(qx,qy);
}
垃圾題目
我終於AC了!
謝謝大家支援!