[1162] LeetCode. Análisis del Mapa

título

Ahora tiene una mano de tamaño N x "mapa" de rejilla (rejilla) de N, por encima de cada "zona" (células) son etiquetados con 0 y 1 también. Donde 0 representa el océano, 1 en nombre de la tierra, ya sabes áreas marinas más alejado de áreas de tierra de cuál se trata? Por favor, devuelva el área al mar desde las zonas de tierra más próxima.
Estamos hablando aquí de la distancia "a distancia de Manhattan" (distancia Manhattan) :( x0, y0 ) y (x1, y1) la distancia entre las dos regiones es | x0 - x1 | + | y0 - y1 |.
Si hacemos un mapa del océano o única tierra, devuelva -1.

Ejemplo 1:

输入:[[1,0,1],[0,0,0],[1,0,1]]
输出:2
解释: 
海洋区域 (1, 1) 和所有陆地区域之间的距离都达到最大,最大距离为 2。

Ejemplo 2:

输入:[[1,0,0],[0,0,0],[0,0,0]]
输出:4
解释: 
海洋区域 (2, 2) 和所有陆地区域之间的距离都达到最大,最大距离为 4。

consejos:

  • 1 <= grid.length == rejilla [0] .length <= 100
  • rejilla [i] [j] no es 0 1

pensamiento

código

class Solution {
public:
    static constexpr int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
    static constexpr int MAX_N = 100 + 5;

    struct Coordinate {
        int x, y, step;
    };

    int n, m;
    vector<vector<int>> a;

    bool vis[MAX_N][MAX_N];

    int findNearestLand(int x, int y) {
        memset(vis, 0, sizeof vis);
        queue <Coordinate> q;
        q.push({x, y, 0});
        vis[x][y] = 1;
        while (!q.empty()) {
            auto f = q.front(); q.pop();
            for (int i = 0; i < 4; ++i) {
                int nx = f.x + dx[i], ny = f.y + dy[i];
                if (!(nx >= 0 && nx <= n - 1 && ny >= 0 && ny <= m - 1)) continue;
                if (!vis[nx][ny]) {
                    q.push({nx, ny, f.step + 1});
                    vis[nx][ny] = 1;
                    if (a[nx][ny]) return f.step + 1;
                }
            }
        }
        return -1;
    }
    
    int maxDistance(vector<vector<int>>& grid) {
        this->n = grid.size();
        this->m = grid.at(0).size();
        a = grid;
        int ans = -1;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < m; ++j) {
                if (!a[i][j]) {
                    ans = max(ans, findNearestLand(i, j));
                }
            }
        }
        return ans;
    }
};

Supongo que te gusta

Origin www.cnblogs.com/galaxy-hao/p/12595649.html
Recomendado
Clasificación