# CSPT21 Lecture 15
## [Unique Paths III](https://leetcode.com/problems/unique-paths-iii/)
```
class Solution:
res = 0
"""
Plan
Do DFS from the starting cell and do a search to get to the goal cell.
Once you are at the goal cell, check if every valid cell has been visited.
If not all valid cells have been visited, backtrack and try another solution.
Else, add that to numPathsFound
"""
def uniquePathsIII(self, grid: List[List[int]]) -> int:
startingPoint = self.findStartingPoint(grid)
self.uniquePathsIIIHelper(grid, startingPoint[0], startingPoint[1])
return self.res
def uniquePathsIIIHelper(self, grid, x, y):
width, height = len(grid[0]), len(grid)
if x < 0 or y < 0 or x >= width or y >= height or grid[y][x] == -1:
return
if grid[y][x] == 2:
for i in range(height):
for j in range(width):
if grid[i][j] == 0:
return
self.res += 1
return
grid[y][x] = -1
self.uniquePathsIIIHelper(grid, x - 1, y)
self.uniquePathsIIIHelper(grid, x + 1, y)
self.uniquePathsIIIHelper(grid, x, y - 1)
self.uniquePathsIIIHelper(grid, x, y + 1)
grid[y][x] = 0
def findStartingPoint(self, grid):
for y in range(len(grid)):
for x in range(len(grid[0])):
if grid[y][x] == 1:
return (x, y)
```