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

My code:

class Solution {
public:
    int uniquePathsIII(vector<vector<int>>& grid) {
        int ans;
        pair<int, int> start, end;
        for (int i = 0; i < grid.size(); ++i) {
            for (int j = 0; j < grid[0].size(); ++j) {
                if (grid[i][j] == 1)
                    start = {i, j};
                if (grid[i][j] == 2)
                    end = {i, j};
            }
        }

        helper(grid, start, end);

        return ans;
    }

private:
    int ans = 0;

    void helper(const vector<vector<int>>& grid, const pair<int, int>& start, const pair<int, int>& end) {
        vector<vector<int>> temp = grid;
        int startX = start.first;
        int startY = start.second;
        // cout << start.first << " " << start.second << endl;
        // cout << end.first << " " << end.second << endl;
        dfs(temp, startX+1, startY, end);
        dfs(temp, startX-1, startY, end);
        dfs(temp, startX, startY+1, end);
        dfs(temp, startX, startY-1, end);
    }

    void dfs(vector<vector<int>> temp, int curX, int curY, const pair<int, int>& end) {
        if (curX == end.first && curY == end.second && check(temp)) ans++, return;
        if (curX < 0 || curX >= temp.size() || curY < 0 || curY >= temp[0].size() || temp[curX][curY] != 0) return;

        // cout << curX << " " << curY << endl;

        temp[curX][curY] = 3;
        dfs(temp, curX+1, curY, end);
        dfs(temp, curX-1, curY, end);
        dfs(temp, curX, curY+1, end);
        dfs(temp, curX, curY-1, end);

    }

    bool check(vector<vector<int>>& temp) {
        for (int i = 0; i < temp.size(); ++i) {
            for (int j = 0; j < temp[0].size(); ++j) {
                if (temp[i][j] == 0) return false;
            }
        }
        return true;
    }
};

/*

[[1,0,0,0],
 [0,0,0,0],
 [0,0,2,-1]]

*/

  

Approach #2: DFS. [C++]

class Solution {
public:
    int uniquePathsIII(vector<vector<int>>& grid) {
        int num = 1;
        int sx = -1, sy = -1;
        for (int i = 0; i < grid.size(); ++i)
            for (int j = 0; j < grid[0].size(); ++j)
                if (grid[i][j] == 0) num++;
                else if (grid[i][j] == 1) sx = i, sy = j;
        return dfs(grid, sx, sy, num);
    }

private:
    int dfs(vector<vector<int>>& grid, int cx, int cy, int num) {
        if (cx < 0 || cx >= grid.size() || cy < 0 || cy >= grid[0].size() || grid[cx][cy] == -1) return 0;
        if (grid[cx][cy] == 2) return num == 0;
        grid[cx][cy] = -1;
        int path = dfs(grid, cx+1, cy, num-1)+
                   dfs(grid, cx-1, cy, num-1)+
                   dfs(grid, cx, cy+1, num-1)+
                   dfs(grid, cx, cy-1, num-1);
        grid[cx][cy] = 0;
        return path;
    }
};

  

Analysis:

In the first code. I don‘t get the correct answer. Maybe my thinking is wrong in this problem.

原文地址:https://www.cnblogs.com/ruruozhenhao/p/10356962.html

时间: 2024-08-30 15:42:19

980. Unique Paths III的相关文章

LC 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 repre

原题链接在这里:980. Unique Paths III

原题链接在这里:https://leetcode.com/problems/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 s

Leetcode之深度优先搜索&amp;回溯专题-980. 不同路径 III(Unique Paths III)

深度优先搜索的解题详细介绍,点击 在二维网格 grid 上,有 4 种类型的方格: 1 表示起始方格.且只有一个起始方格. 2 表示结束方格,且只有一个结束方格. 0 表示我们可以走过的空方格. -1 表示我们无法跨越的障碍. 返回在四个方向(上.下.左.右)上行走时,从起始方格到结束方格的不同路径的数目,每一个无障碍方格都要通过一次. 示例 1: 输入:[[1,0,0,0],[0,0,0,0],[0,0,2,-1]] 输出:2 解释:我们有以下两条路径: 1. (0,0),(0,1),(0,2

[Swift Weekly Contest 120]LeetCode980. 不同路径 III | 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 repre

leetcode笔记:Unique Paths

一. 题目描述 A robot is located at the top-left corner of a m n grid (marked 'Start' in the diagram below). The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked 'Finish

LeetCode --- 62. Unique Paths

题目链接:Unique Paths A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (ma

62.Unique Paths (法1递归-动态规划法2数学公式)

A robot is located at the top-left corner of a m x n grid(marked 'Start' in the diagram below). The robot can only move either down or right at any point in time. Therobot is trying to reach the bottom-right corner of the grid (marked 'Finish'in the

[LeetCode]Unique Paths

题目: 从左上角到右下角的所有可能路径. 思路1: 回溯法去递归遍历所有的路径,但是复杂度太大,无法通过.checkPath方法实现 动态规划法,从左上角到每一格的路径数与它的上面一格和左边一格的路径和: N(m,n)=N(m-1,n)+N(m,n-1): 注意:第一行和第一列的特殊情况. package com.example.medium; /** * A robot is located at the top-left corner of a m x n grid (marked 'Sta

LintCode : Unique Paths II

Problem Description: Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. How many unique paths would there be? An obstacle and empty space is marked as 1 and 0 respectively in the grid. Code: public class Solutio