入门OJ 1281【营救(save)】

描述

铁塔尼号遇险了!他发出了求救信号。距离最近的哥伦比亚号收到了讯息,时间就是生命,必须尽快 赶到那里。 通过侦测,哥伦比亚号获取了一张海洋图。这张图将海洋部分分化成 n*n 个比较小的单位,其中用 1 标明的是陆地,用 0 标明是海洋。船只能从一个格子,移到相邻的四个格子。

题目

 为了尽快赶到出事地点,哥伦比亚号最少需要走多远的距离。

输入输出格式

输入

第一行为 n(n≤1000),下面是一个 n*n 的 0、1 矩阵,表示海洋地图 最后一行为四个小于 n 的整数,分别表示哥伦比亚号和铁塔尼号的位置。

输出

哥伦比亚号到铁塔尼号的最短距离,答案精确到整数。

输入输出样例

 输入样例 1

3
001
101
100
1 1 3 3 

输出样例 1

4

解题思路

  本题只需用广搜找最短路即可。

题解

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int dir[4][2]={1,0,0,1,-1,0,0,-1};
 4 int x1,yy,x2,y2,n;
 5 int dz[1005][1005];
 6 struct node{
 7     int x;
 8     int y;
 9     int t;
10 };
11 void bfs(int x,int y)
12 {
13     node p,t;
14     p.x=x;
15     p.y=y;
16     p.t=0;
17     queue<node> q;
18     for(q.push(p);!q.empty();q.pop())
19     {
20         p=q.front();
21         if(p.x==x2&& p.y==y2)
22         {
23             printf("%d
",p.t);
24             break;
25         }
26         for(int i=0;i<4;i++)
27         {
28             t.x=p.x+dir[i][0];
29             t.y=p.y+dir[i][1];
30             if(t.x>0&&t.x<=n&&t.y>0&&t.y<=n&&!dz[t.x][t.y])
31             {
32                 dz[t.x][t.y]=1;
33                 t.t=p.t+1;
34                 q.push(t);
35             }
36         }
37     }
38 }
39 int main()
40 {
41     cin>>n;
42     for(int i=1;i<=n;i++)
43     {
44         for(int j=1;j<=n;j++)
45         {    char c;
46             cin>>c;
47             dz[i][j]=c-'0';
48         }    
49     }
50     scanf("%d%d%d%d",&x1,&yy,&x2,&y2);
51     dz[x1][yy]=1;
52     if(x1==x2&&yy==y2)
53         cout<<0;
54     else
55         bfs(x1,yy);
56     return 0;
57 }
原文地址:https://www.cnblogs.com/hualian/p/11159187.html