I am using here backtracking with memoization (look at 'used').
| 1 | // I am using here backtracking with memoization (look at 'used'). |
| 2 | class Solution { |
| 3 | private: |
| 4 | int n; |
| 5 | int m; |
| 6 | int answer = 0; |
| 7 | int required = 0; |
| 8 | |
| 9 | bool isValid(int x, int y) { |
| 10 | return (0 <= x && x < n) && (0 <= y && y < m); |
| 11 | } |
| 12 | |
| 13 | void dfs(vector<vector<int>> &grid, pair<int, int> s, pair<int, int> e, vector<pair<int, int>>& st, vector<vector<bool>> &used) { |
| 14 | if (!st.empty() && st.back() == e && st.size() == required - 1) { |
| 15 | ++answer; |
| 16 | |
| 17 | return; |
| 18 | } |
| 19 | |
| 20 | vector<int> dx = {0, 1, 0, -1}; |
| 21 | vector<int> dy = {-1, 0, 1, 0}; |
| 22 | |
| 23 | used[s.first][s.second] = true; |
| 24 | for (int i = 0; i < 4; ++i) { |
| 25 | if (isValid(s.first + dx[i], s.second + dy[i]) && (grid[s.first + dx[i]][s.second + dy[i]] == 0 || grid[s.first + dx[i]][s.second + dy[i]] == 2) && !used[s.first + dx[i]][s.second + dy[i]]) { |
| 26 | used[s.first + dx[i]][s.second + dy[i]] = true; |
| 27 | st.push_back({s.first + dx[i], s.second + dy[i]}); |
| 28 | dfs(grid, {s.first + dx[i], s.second + dy[i]}, e, st, used); |
| 29 | st.pop_back(); |
| 30 | used[s.first + dx[i]][s.second + dy[i]] = false; |
| 31 | } |
| 32 | } |
| 33 | } |
| 34 | public: |
| 35 | int uniquePathsIII(vector<vector<int>>& grid) { |
| 36 | n = (int) grid.size(); |
| 37 | m = (int) grid[0].size(); |
| 38 | |
| 39 | pair<int, int> s; |
| 40 | pair<int, int> e; |
| 41 | for (int i = 0; i < n; ++i) { |
| 42 | for (int j = 0; j < m; ++j) { |
| 43 | if (grid[i][j] == 1) { |
| 44 | s = {i, j}; |
| 45 | ++required; |
| 46 | } |
| 47 | |
| 48 | if (grid[i][j] == 2) { |
| 49 | e = {i, j}; |
| 50 | ++required; |
| 51 | } |
| 52 | |
| 53 | if (grid[i][j] == 0) { |
| 54 | ++required; |
| 55 | } |
| 56 | } |
| 57 | } |
| 58 | |
| 59 | vector<pair<int, int>> st; |
| 60 | vector<vector<bool>> used(n, vector<bool> (m, false)); |
nothing calls this directly
no outgoing calls
no test coverage detected