LeetCode1162. As Far from Land as Possible——BFS

一、题目

Given an n x n grid containing only values 0 and 1, where 0 represents water and 1 represents land, find a water cell such that its distance to the nearest land cell is maximized, and return the distance. If no land or water exists in the grid, return -1.

The distance used in this problem is the Manhattan distance: the distance between two cells (x0, y0) and (x1, y1) is |x0 - x1| + |y0 - y1|.

Example 1:

Input: grid = [[1,0,1],[0,0,0],[1,0,1]]
Output: 2
Explanation: The cell (1, 1) is as far as possible from all the land with distance 2.
Example 2:

Input: grid = [[1,0,0],[0,0,0],[0,0,0]]
Output: 4
Explanation: The cell (2, 2) is as far as possible from all the land with distance 4.

Constraints:

n == grid.length
n == grid[i].length
1 <= n <= 100
grid[i][j] is 0 or 1

二、题解

class Solution {
public:
    int maxDistance(vector<vector<int>>& grid) {
        int n = grid.size();
        queue<vector<int>> q;
        vector<int> move = {-1, 0, 1, 0, -1};
        vector<vector<bool>> visted(n,vector<bool>(n,false));
        int sea = 0;
        for(int i = 0;i < n;i++){
            for(int j = 0;j < n;j++){
                if(grid[i][j]){
                    visted[i][j] = true;
                    q.push({i,j});
                }
                else sea++;
            }
        }
        if(sea == 0 || sea == n * n) return -1;
        int level = 0;
        while(!q.empty()){
            level++;
            int size = q.size();
            while(size--){
                int x = q.front()[0];
                int y = q.front()[1];
                q.pop();
                for(int i = 0;i < 4;i++){
                    int nextX = x + move[i];
                    int nextY = y + move[i+1];
                    if(nextX >= 0 && nextY >= 0 && nextX < n && nextY < n && !visted[nextX][nextY]){
                        visted[nextX][nextY] = true;
                        q.push({nextX,nextY});
                    }
                }
            }
        }
        return level - 1;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值