知识点

数组,广度优先遍历

解题思路

将全部为2的节点放到队列中。

当队列不为空并且k大于0时,我们将队列中的节点取出,将其上下左右为1的节点都置为2,再将其放入队列中。

其中我们可以用set来保存已经处理过的节点,减少判断

Java题解

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param pasture int整型二维数组 
     * @param k int整型 
     * @return int整型
     */
    public int healthyCows (int[][] pasture, int k) {
        // write code here
        int n = pasture.length, m = pasture[0].length;
        // 存放判断过的结点
        Set<Integer> set = new HashSet<>();
        Deque<int[]> deque = new LinkedList<>();
        int ans = m * n;
        // 把为2的添加进队列
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if(pasture[i][j] == 2){
                    deque.offerFirst(new int[]{i,j});
                    set.add(i*m+j);
                    ans--;
                } else if(pasture[i][j] == 0) {
                    ans--;
                }
            }
        }
        // 四个方向
        int[][] point = new int[][]{{0,1},{0,-1},{1,0},{-1,0}};
        while(!deque.isEmpty() && k > 0){
            int size = deque.size();
            //遍历当前队列
            for(int i = 0; i < size; i++){
                int[] ints = deque.pollFirst();
                for(int j = 0; j < 4; j++){
                    int newY = ints[0] + point[j][0];
                    int newX = ints[1] + point[j][1];
                    if(set.contains(newY * m + newX) || newY < 0 || newY >= n || newX < 0 || newX >= m){
                        continue;
                    }
                    if(pasture[newY][newX] == 1){
                        deque.offerLast(new int[]{newY,newX});
                        set.add(newY * m + newX);
                        ans--;
                    }
                }
            }
            k--;
        }
        return ans;
    }
}