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
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 <= grid.length * grid[0].length <= 20
Runtime: 0 ms, faster than 100.00% of C++ online submissions for Unique Paths III.
// // Created by yuxi on 2019/1/21. // #include <vector> #include <iostream> using namespace std; class Solution { public: int cntzero; int ret; vector<vector<int>> dirs = {{0,1},{0,-1},{-1,0},{1,0}}; int uniquePathsIII(vector<vector<int>>& grid) { vector<vector<int>> records(2, vector<int>(2,0)); ret = 0; cntzero = 0; for(int i=0; i<grid.size(); i++) { for(int j=0; j < grid[0].size(); j++) { if(grid[i][j] == 1) { records[0][0] = i; records[0][1] = j; } else if(grid[i][j] == 2){ records[1][0] = i; records[1][1] = j; } else if(grid[i][j] == 0) cntzero++; } } int cnt = 0; vector<bool> used(grid.size()*grid[0].size(), false); vector<vector<int>> path; helper(grid, path, records[0], records[1], cnt, used); //cout << ret << endl; return ret; } void helper(vector<vector<int>>& grid, vector<vector<int>>& path, vector<int> s, vector<int>& e, int cnt, vector<bool>& used) { // for(int i=0; i<path.size(); i++) { // cout << "("<< path[i][0] << " " << path[i][1] << ")" << " "; // } //printgird(grid); int N = grid.size(), M = grid[0].size(); if(s[0] == e[0] && s[1] == e[1]) { // cout << "(" << s[0] << " " << s[1] << ")" << " " << endl; if(cnt == cntzero) ret++; return; } // cout << endl; // used[s[0]*N+s[1]] = true; grid[s[0]][s[1]] = -2; path.push_back({s[0],s[1]}); for(auto& dir : dirs) { int newx = dir[0] + s[0], newy = dir[1] + s[1]; if(newx >= 0 && newx < N && newy >= 0 && newy < M && grid[newx][newy] != -2 && grid[newx][newy] != 1 && grid[newx][newy] != -1) { int newcnt = cnt; if(grid[newx][newy] == 0) newcnt++; helper(grid, path, {newx, newy}, e, newcnt, used); } } grid[s[0]][s[1]] = 0; // used[s[0]*N+s[1]] = false; path.pop_back(); } void printgird(vector<vector<int>>& grid) { int N = grid.size(), M = grid[0].size(); for(int i=0; i<N; i++) { for(int j=0; j<M; j++) { cout << grid[i][j] << " "; } cout << endl; } } };