1010: 營救(bfs的尋找兩點之間的最短路程的用法)

題目: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;
}
相關文章
相關標籤/搜索