1. 程式人生 > 其它 >【寬度優先搜尋BFS】營救

【寬度優先搜尋BFS】營救

技術標籤: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了!
謝謝大家支援!