题目: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均是一起进行的,所以最先找到了那个对应的就是最短的路程了;

代码:

#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;
}

haixinjiazu
1 声望0 粉丝