• 980. Unique Paths III


    On a 2-dimensional grid, there are 4 types of squares:

    • 1 represents the starting square.  There is exactly one starting square.
    • 2 represents the ending square.  There is exactly one ending square.
    • 0 represents empty squares we can walk over.
    • -1 represents obstacles that we cannot walk over.

    Return the number of 4-directional walks from the starting square to the ending square, that walk over every non-obstacle square exactly once.

    Example 1:

    Input: [[1,0,0,0],[0,0,0,0],[0,0,2,-1]]
    Output: 2
    Explanation: We have the following two paths: 
    1. (0,0),(0,1),(0,2),(0,3),(1,3),(1,2),(1,1),(1,0),(2,0),(2,1),(2,2)
    2. (0,0),(1,0),(2,0),(2,1),(1,1),(0,1),(0,2),(0,3),(1,3),(1,2),(2,2)

    Example 2:

    Input: [[1,0,0,0],[0,0,0,0],[0,0,0,2]]
    Output: 4
    Explanation: We have the following four paths: 
    1. (0,0),(0,1),(0,2),(0,3),(1,3),(1,2),(1,1),(1,0),(2,0),(2,1),(2,2),(2,3)
    2. (0,0),(0,1),(1,1),(1,0),(2,0),(2,1),(2,2),(1,2),(0,2),(0,3),(1,3),(2,3)
    3. (0,0),(1,0),(2,0),(2,1),(2,2),(1,2),(1,1),(0,1),(0,2),(0,3),(1,3),(2,3)
    4. (0,0),(1,0),(2,0),(2,1),(1,1),(0,1),(0,2),(0,3),(1,3),(1,2),(2,2),(2,3)

    Example 3:

    Input: [[0,1],[2,0]]
    Output: 0
    Explanation: 
    There is no path that walks over every empty square exactly once.
    Note that the starting and ending square can be anywhere in the grid.
    

    Note:

    1. 1 <= grid.length * grid[0].length <= 20
    class Solution {
        public int uniquePathsIII(int[][] grid) {
            int n = grid.length * grid[0].length;
            int[] res = new int[1];
            for(int i = 0; i < grid.length; i++) {
                for(int j = 0; j < grid[0].length; j++) {
                    if(grid[i][j] == 1) dfs(grid, i, j, res, 0, n);
                }
            }
            return res[0];
        }
        public void dfs(int[][] grid, int i, int j, int[] res, int count, int n) {
            int cur = grid[i][j];
            if(cur == 2 && count == n - 1) {
                res[0]++;
                return;
            }
            if(cur == -1) return;
            
            grid[i][j] = -1;
            if(i > 0) dfs(grid, i - 1, j, res, count + 1, n);
            if(i < grid.length - 1) dfs(grid, i + 1, j, res, count + 1, n);
            if(j > 0) dfs(grid, i, j - 1, res, count + 1, n);
            if(j < grid[0].length - 1) dfs(grid, i, j + 1, res, count + 1, n);
            grid[i][j] = cur;
        }
    }

    38/39?尼玛

    class Solution {
        int res = 0, empty = 1, sx, sy;
        public int uniquePathsIII(int[][] grid) {
            int m = grid.length, n = grid[0].length;
            for (int i = 0; i < m; ++i) {
                for (int j = 0; j < n; ++j) {
                    if (grid[i][j] == 0) empty++;
                    else if (grid[i][j] == 1) {
                        sx = i;
                        sy = j;
                    }
                }
            }
            dfs(grid, sx, sy);
            return res;
        }
    
        public void dfs(int[][] grid, int x, int y) {
            if (x < 0 || x >= grid.length || y < 0 || y >= grid[0].length || grid[x][y] == -1)
                return;
            if (grid[x][y] == 2) {
                if (empty == 0) res++;
                return;
            }
            grid[x][y] = -1;
            empty--;
            dfs(grid, x + 1, y);
            dfs(grid, x - 1, y);
            dfs(grid, x, y + 1);
            dfs(grid, x, y - 1);
            grid[x][y] = 0;
            empty++;
        }
    }

    答案来自lee哥,没啥区别我觉得?

  • 相关阅读:
    Ubuntu 11.10版本下的软件中心安装软件的默认路径
    C++中构造函数调用与申明方式的关系
    VMware Workstation 虚拟机(客户机)创建和主机共享文件夹
    观察者模式——三英雄战吕布
    如何在yarn上运行Hello World(二)
    Cat 客户端如何构建调用链消息树
    Cat 跨线程之 TaggedTransaction 用法和原理分析
    Cat 客户端采用什么策略上报消息树
    Cat 跨线程之 ForkedTransaction 用法和原理分析
    jest for elasticsearch
  • 原文地址:https://www.cnblogs.com/wentiliangkaihua/p/13722207.html
Copyright © 2020-2023  润新知