Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.*;
- public class b {
- static int [][] dirs = {{0,1},{1,0},{-1,0},{0,-1}};
- public static int maxTrees(int [][] matrix, int [][] fireStations, int [][] fires) {
- // [x, y]
- Queue<int[]> fireQ = new LinkedList<>();
- Queue<int[]> fireStationQ = new LinkedList<>();
- int N = matrix.length, M = matrix[0].length;
- boolean [][] visitedFire = new boolean [N][M];
- boolean [][] visitedStation = new boolean [N][M];
- int savedTrees = 0;
- for (int [] fireStation: fireStations) {
- int x = fireStation[0], y = fireStation[1];
- if (matrix[x][y] == -1) continue;
- savedTrees += matrix[x][y];
- visitedStation[x][y] = true;
- fireStationQ.add(fireStation);
- }
- for (int [] fire: fires) {
- matrix[fire[0]][fire[1]] = 0;
- visitedFire[fire[0]][fire[1]] = true;
- fireQ.add(fire);
- }
- while (!fireStationQ.isEmpty()) {
- int stations = fireStationQ.size();
- //stations have priority, process before fire step
- for (int i =0; i < stations;i++){
- int [] station = fireStationQ.poll();
- for (int [] dir : dirs) {
- int x = station[0]+dir[0];
- int y = station[1]+dir[1];
- if (x >=0 && y >=0 && x < N && y <M && matrix[x][y] != -1 && !visitedStation[x][y]) {
- visitedStation[x][y] = true;
- savedTrees += matrix[x][y];
- fireStationQ.add(new int [] { x,y});
- }
- }
- }
- // assume fires can still spread after meeting firefighter
- int fireSize = fireQ.size();
- for (int i = 0; i < fireSize; i++){
- int [] fireCell = fireQ.poll();
- for (int [] dir : dirs) {
- int x = fireCell[0]+dir[0];
- int y = fireCell[1]+dir[1];
- if (x >=0 && y >=0 && x < N && y < M && matrix[x][y] != -1 && !visitedFire[x][y]) {
- visitedFire[x][y] = true;
- matrix[x][y] = 0;
- fireQ.add(new int [] { x,y});
- }
- }
- }
- }
- return savedTrees;
- }
Advertisement
Add Comment
Please, Sign In to add comment