30 Day Challenge Day 13 | Leetcode 980. Unique Paths III
题解
Hard | Backtracking/DFS
这道题使用标准的Backtracking套路,不难得解。一开始没有注意两点,导致错误:
- 起点不一定是在左上角的grid[0][0],而是需要根据条件找出来;
- 每一个非障碍位置都需要走一次,这就不同于之前的 Unique Paths 的题,有些格子可以不走,只要能到达终点即可。为了这个要求,需要另外跟踪一个变量 remain ,就是非障碍的格子的数量,只记录能经过所有这些格子的路径。
除去这两点,这道题还是中规中矩,作为 Hard 级别的题,稍显勉强。
class Solution {
public:
int uniquePathsIII(vector<vector<int>>& grid) {
if(grid.empty()) return 0;
int start_x, start_y, count = 0, remain = 0;
for(int i = 0; i < grid.size(); i++) {
for(int j = 0; j < grid[0].size(); j++) {
if(grid[i][j] >= 0) remain++;
if(grid[i][j] == 1) {
start_x = i;
start_y = j;
}
}
}
vector<vector<bool>> visited(grid.size(), vector<bool>(grid[0].size(), false));
helper(grid, start_x, start_y, visited, remain, count);
return count;
}
void helper(vector<vector<int>>& grid, int x, int y, vector<vector<bool>>& visited, int remain, int& count) {
if(grid[x][y] == 2 && remain == 1) {
count++;
return;
}
visited[x][y] = true;
int dirs[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
for(int i = 0; i < 4; i++) {
int next_x = x + dirs[i][0];
int next_y = y + dirs[i][1];
if(next_x >= 0 && next_x < grid.size() && next_y >= 0 && next_y < grid[0].size()
&& grid[next_x][next_y] != -1 && !visited[next_x][next_y]) {
helper(grid, next_x, next_y, visited, remain-1, count);
}
}
visited[x][y] = false;
}
};