复制代码

营救 【题解】

营救:

内存限制:256 MiB 
时间限制:1000 ms

题目描述:

铁塔尼号遇险了!他发出了求救信号。距离最近的哥伦比亚号收到了讯息,时间就是生命,必须尽快 赶到那里。

通过侦测,哥伦比亚号获取了一张海洋图。这张图将海洋部分分化成 n*n 个比较小的单位,其中用 1 标明的是陆地,用 0 标明是海洋。船只能从一个格子,移到相邻的四个格子。

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

输入格式

第一行为 n,下面是一个 n*n 的 0、1 矩阵,表示海洋地图。

最后一行为四个小于 n 的整数,分别表示哥伦比亚号和铁塔尼号的位置。
输出格式

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

样例输入 :

3
001
101
100
1 1 3 3

样例输出

4

这道题其实并不难,就是一道简单的广搜。注释都写到代码上了。

#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;

const int MAXN = 1005;
const int dx[] = { 0, 1, -1, 0, 0 };
const int dy[] = { 0, 0, 0, 1, -1 };//方向数组

int s, t, ss, tt, n;
int ans = 0x3f3f3f3f;//极大值,用于查找最小值
bool map[MAXN][MAXN];//储存地图

struct node {
    int x;
    int y;
    int step;
};//两个坐标,一个是步数

void search_(int x, int y) {
    node p, t;
    p.x = x;
    p.y = y;
    p.step = 0;//初始化
    queue<node> q;
    q.push(p);
    while (!q.empty()) {//搜索
        p = q.front();
        if (p.x == ss && p.y == tt) {
            ans = min(p.step, ans);
            break;
        }//符合条件,找到答案并跳出循环
        for (int i = 1; i <= 4; i++) {
            t.x = p.x + dx[i];
            t.y = p.y + dy[i];//四个方向枚举怎么走
            if (t.x > 0 && t.x <= n && t.y > 0 && t.y <= n && !map[t.x][t.y]) {//此步合法
                map[t.x][t.y] = 1;//就走这步
                t.step = p.step + 1;//增加一步
                q.push(t);//继续搜索
            }
        }
        q.pop();//弹出队首,继续下一次循环
    }
}
int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf("\n");
        for (int j = 1; j <= n; j++) {
            char x;
            scanf("%c", &x);
            map[i][j] = x - '0';
        }
    }//初始化
    scanf("%d %d %d %d", &s, &t, &ss, &tt);//输入
    search_(s, t);
    printf("%d\n", ans);//输出答案
    return 0;
}

posted @ 2020-08-02 19:22  cqbz_yanglin  阅读(382)  评论(1编辑  收藏  举报