1. 程式人生 > >[Swift Weekly Contest 120]LeetCode980. 不同路徑 III | Unique Paths III

[Swift Weekly Contest 120]LeetCode980. 不同路徑 III | Unique Paths III

types leet can Dimension || Once col wal clas

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

在二維網格 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),(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)

示例 2:

輸入:[[1,0,0,0],[0,0,0,0],[0,0,0,2]]
輸出:4
解釋:我們有以下四條路徑: 
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)

示例 3:

輸入:[[0,1],[2,0]]
輸出:0
解釋:
沒有一條路能完全穿過每一個空的方格一次。
請註意,起始和結束方格可以位於網格中的任意位置。 

提示:

  1. 1 <= grid.length * grid[0].length <= 20

32ms

 1 class Solution {
 2     var zero:Int = 0
 3     var ans:Int = 0
 4     func uniquePathsIII(_ grid: [[Int]]) -> Int {
 5         var start1:Int = 0
 6         var start2:Int = 0
 7         for i in 0..<grid.count
 8         {
 9             for j in 0..<grid[0].count
10             {
11                 if grid[i][j] == 0
12                 {
13                     zero += 1
14                 }
15                 if grid[i][j] == 1
16                 {
17                     start1 = i
18                     start2 = j
19                 }
20             }            
21         }
22         var visited:[[Int]] = [[Int]](repeating:[Int](repeating:0,count:grid[0].count),count:grid.count)
23         dfs(grid, start1, start2, visited, 0)
24         return ans
25     }
26     
27     func dfs(_ grid: [[Int]],_ i:Int,_ j:Int,_ visited: [[Int]],_ count:Int)
28     {
29         var  visited = visited
30         if i < 0 || i >= grid.count || j < 0 || j >= grid[0].count || visited[i][j] == 1 || grid[i][j] == -1
31         {
32             return
33         }
34         if grid[i][j] == 2
35         {
36             if count == zero + 1
37             {
38                 ans += 1
39             }
40             return
41         }
42         visited[i][j] = 1
43         dfs(grid, i+1, j, visited, count+1)
44         dfs(grid, i-1, j, visited, count+1)
45         dfs(grid, i, j-1, visited, count+1)
46         dfs(grid, i, j+1, visited, count+1)
47         visited[i][j] = 0
48     }
49 }

[Swift Weekly Contest 120]LeetCode980. 不同路徑 III | Unique Paths III