华为题:污染水域

题目描述

有一块 n×m 的地图,每个格子为水域(1)或陆地(0)。水域每天会向上下左右 四个方向扩散一格,被扩散到的陆地变为水域。求多少天后整个地图全部变为水域。

数据范围: 1 ≤ n, m ≤ 100。

示例

复制代码
输入:
3 3
1 0 0
0 0 0
0 0 1

输出:
2

说明:两个角落是初始水域。第 1 天其相邻格被淹没,第 2 天中心格被淹没,全图变水域。

思路

  • 这是经典的多源 BFS:把所有初始水域同时作为起点(都加入队列,距离为 0);
  • BFS 一层一层向外扩散,每个格子的最短距离就是它"第几天被淹没";
  • 答案 = 所有格子距离的最大值(即离水域最远的格子被淹没的时间);
  • 若初始全是水域,答案为 0。

C 代码

复制代码
#include <stdio.h>

#define MAXN 105

int dist[MAXN][MAXN];               /* -1 表示未淹没,否则为被淹没的天数 */
int qx[MAXN * MAXN], qy[MAXN * MAXN];  /* 手写循环队列存坐标 */
int n, m;
const int dx[4] = {-1, 1, 0, 0};
const int dy[4] = { 0, 0, -1, 1};

int main(void)
{
    if (scanf("%d %d", &n, &m) != 2) return 0;

    int head = 0, tail = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            int x;
            scanf("%d", &x);
            dist[i][j] = -1;
            if (x == 1) {                    /* 所有初始水域作为多源起点 */
                dist[i][j] = 0;
                qx[tail] = i;  qy[tail] = j;  tail++;
            }
        }
    }

    int ans = 0;
    while (head < tail) {
        int x = qx[head], y = qy[head];  head++;
        if (dist[x][y] > ans) ans = dist[x][y];
        for (int k = 0; k < 4; k++) {
            int nx = x + dx[k], ny = y + dy[k];
            if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
            if (dist[nx][ny] != -1) continue;       /* 已淹没过 */
            dist[nx][ny] = dist[x][y] + 1;
            qx[tail] = nx;  qy[tail] = ny;  tail++;
        }
    }

    /* 拓展:若题目允许存在无法淹没的格子(如障碍物),
       此处应再扫描一遍,存在 dist == -1 则输出 -1 */

    printf("%d\n", ans);
    return 0;
}

复杂度: 时间 O(n×m),空间 O(n×m)。每个格子最多入队一次,保证距离正确。

相关推荐
拓恒技术3 小时前
无人机巡检AI算法的工程化落地:从需求到交付的5个核心环节
人工智能·算法·无人机
晨曦中的暮雨3 小时前
限流算法——固定窗口、滑动窗口、漏桶、令牌桶
java·开发语言·算法
怕浪猫4 小时前
Claude Code vs Codex:Computer Use 实现原理深度拆解
算法·面试·github
罗西的思考5 小时前
AI 时代的 “房谋杜断”:如何培养能力、品味与判断力
人工智能·算法·机器学习
淡海水5 小时前
07-02-源码-.NET Core GC分配路径
算法·unity·c#·.netcore·gc·1024程序员节
下一站春风里7 小时前
位运算完整学习笔记:按位与(&)+ 异或(^)
开发语言·c++·算法
DRobot7 小时前
【机械制图与CAD实战(二十五)】螺纹的表示方法
算法·机械制图
用户老李8 小时前
卡尔曼滤波自学教程 10:无迹卡尔曼滤波(UKF)
算法
深圳市益普科技有限公司9 小时前
半导体良率管理YMS:良率与设备参数的相关性,先拉哪几组数据
人工智能·python·算法
程序员清风10 小时前
算法题中的边界条件、测试与调试
开发语言·算法·kotlin