zoukankan      html  css  js  c++  java
  • 286. Walls and Gates

    You are given a m x n 2D grid initialized with these three possible values.

    1. -1 - A wall or an obstacle.
    2. 0 - A gate.
    3. INF - Infinity means an empty room. We use the value 231 - 1 = 2147483647 to represent INF as you may assume that the distance to a gate is less than 2147483647.

    Fill each empty room with the distance to its nearest gate. If it is impossible to reach a gate, it should be filled with INF.

    For example, given the 2D grid:

    INF  -1  0  INF
    INF INF INF  -1
    INF  -1 INF  -1
      0  -1 INF INF

    After running your function, the 2D grid should be: 

      3  -1   0   1
      2   2   1  -1
      1  -1   2  -1
      0  -1   3   4   

    将 gate 做dfs 或者存入queue
        public void wallsAndGates(int[][] rooms) {
            for(int i = 0; i< rooms.length; i++){
                for(int j = 0; j < rooms[0].length; j ++){
                    if(rooms[i][j] == 0)
                        dfs(rooms, i, j, 0);
                }
            }
        }
        public void dfs(int[][] rooms, int i , int j, int deep){
            rooms[i][j] = deep;
            if(i < rooms.length - 1 && rooms[i+1][j] > deep)
                dfs(rooms, i + 1, j, deep +1);
            
            if(j < rooms[0].length - 1 && rooms[i][j + 1] > deep)
               dfs(rooms, i, j + 1, deep +1);
    
           if(j > 0 && rooms[i][j - 1] > deep)
                dfs(rooms, i, j - 1, deep +1);
            
           if(i > 0 && rooms[i-1][j] > deep)
                dfs(rooms, i - 1, j, deep +1);
        }

    BFS

    class Node{
        int x;
        int y;
        public Node(int x, int y){
            this.x = x;
            this.y = y;
        }
    }
    private  int inf = Integer.MAX_VALUE;
        public  void wallsAndGates(int[][] nums){
            Queue<Node> queue = new LinkedList<>();
            for(int i = 0 ; i < nums.length; i++){
                for(int j = 0; j < nums[0].length; j ++){
                    if(nums[i][j] == 0){
                        Node x = new Node(i,j);
                        queue.add(x);
                    }
                }
            }
            bfs(queue, nums);
        }
        public  void bfs(Queue<Node> queue, int[][] nums){
            while(!queue.isEmpty()){
                Node root = queue.poll();
                int x = root.x;
                int y = root.y;
                if(x < nums.length - 1 && nums[x+1][y] == inf){
                    nums[x+1][y] = nums[x][y] + 1;
                    queue.add(new Node(x+1,y));
                }
                if(x > 0 && nums[x-1][y] == inf){
                    nums[x-1][y] = nums[x][y] + 1;
                    queue.add(new Node(x-1,y));
                }
                if(y < nums[0].length - 1 && nums[x][y+1] == inf){
                    nums[x][y+1] = nums[x][y] + 1;
                    queue.add(new Node(x,y+1));
                }
                if(y > 0 && nums[x][y-1] == inf){
                    nums[x][y-1] = nums[x][y] + 1;
                    queue.add(new Node(x,y-1));
                }
            }
        }
    
    }
  • 相关阅读:
    激活Maven profile的几种方式
    利用maven的filter和profile实现不同环境使用不同的配制
    通过profile 用maven命令打不同配置的变量包
    使用Maven Profile实现多环境构建
    Window下Nexus私服搭建
    linux之nginx
    linux之命令进阶
    linux之常见命令
    flask中路由的本质源码分析
    vmware+CentOs 6.9的安装步骤
  • 原文地址:https://www.cnblogs.com/joannacode/p/5947919.html
Copyright © 2011-2022 走看看