題目:1010: 營救
Description
鐵塔尼號遇險了!他發出了求救信號。距離最近的哥倫比亞號收到了訊息,時間就是生命,必須儘快趕到那裏。
經過偵測,哥倫比亞號獲取了一張海洋圖。這張圖將海洋部分分化成n*n個比較小的單位,其中用1標明的是陸地,用0標明是海洋。船隻能從一個格子,移到相鄰的四個格子。
爲了儘快趕到出事地點,哥倫比亞號最少須要走多遠的距離。
Input
第一行爲n,下面是一個n*n的0、1矩陣,表示海洋地圖
最後一行爲四個小於n的整數,分別表示哥倫比亞號和鐵塔尼號的位置(橫縱座標從1開始計)。
n<=1000
Output
哥倫比亞號到鐵塔尼號的最短距離。
Sample Input
3
001
101
100
1 1 3 3
Sample Output
4數組
思路:這個對於輸入的地圖,先從其實座標開始,而且將起始座標標記爲1(把每個已經走過了的都標記爲1,這樣來表示已經走過,不能回頭走);而後依次進行找,找到一個能夠進行移動的座標就將這個存到隊列中,而後當最初的找完存完以後,再從隊列中在取出隊首的值,再進行相同的操做,當到達對應的終點位置的時候便可跳出,由於bfs均是一塊兒進行的,因此最早找到了那個對應的就是最短的路程了;code
代碼:隊列
#include<stdio.h> #include<string.h> struct point{ int x,y; int step; }; int num_x[4]={0,-1,0,1};//上下左右的時候提早用數組存,這樣到時候依次用循環便可肯定移動的步數 int num_y[4]={-1,0,1,0};//而且x與y分別存,但要對應才能夠。(這樣能夠減少寫的代碼的長度); char a[1005][1005]; point maps[1005*1005]; int main() { int n,i,j; int x1,y1,x2,y2; while(scanf("%d",&n)!=EOF){ memset(a,0,sizeof(a)); for(i=0;i<n;i++) scanf("%s",a[i]); scanf("%d%d%d%d",&x1,&y1,&x2,&y2); int head=1,rear=1;//用這個來表示隊首與隊尾; point st; st.x=x1;st.y=y1; st.step=0; a[x1-1][y1-1]='1'; maps[rear]=st; rear++; // printf("%d %d\n",head,rear); while(head!=rear){ point k=maps[head]; ++head;//從隊首中移出一個 //printf("%d %d\n",k.x,k.y); if(k.x==x2&&k.y==y2){ printf("%d\n",k.step); break; } for(i=0;i<4;++i){//這裏就是用循環來進行上下左右移動 point ss=k; ss.x=k.x+num_x[i]; ss.y=k.y+num_y[i]; if(a[ss.x-1][ss.y-1]=='0'&&ss.x<=n&&ss.x>0&&ss.y<=n&&ss.y>0){//這個是進行判斷的(因此再每次直接進行座標的上下左右移動之後,要再判斷一下是否還在矩陣中); ss.step=k.step+1; maps[rear]=ss; rear++;//從隊尾中加入一個新的 a[ss.x-1][ss.y-1]='1'; } } // printf("%d %d\n",head,rear); } } return 0; }