题目: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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。