# All Roads Lead to Rome!

You are standing at the point **(x, y)** in the *lattice* grid of pairs of non-negative numbers, and wish to make your way to the origin point **(0, 0)**. At any point, you are allowed to move either one step left or one step down. Furthermore, you are never allowed to step into any of the points in the **tabu** list (origin is never in **tabu**). This function should add up the number of different paths that lead from the point **(x,y)** to the origin **(0,0)** under these constraints.

*
If you feel yourself in need of a hint, here are two ideas of solving (click on a hint):
*

*Hint 1*

*
This constrained variation of the classic combinatorial problem turns out to have a reasonably straightforward recursive solution. As the base case, the number of paths from the origin (0, 0) to itself equals one for the empty path (note the crucial difference between an empty path that exists, versus a nonexistent path!). If the point (x, y) is in the tabu list, the number of paths from that point to the origin equals zero. Otherwise, the number of paths from the point to the origin equals the sum of paths from the two neighbors (x-1, y) and (x, y-1). However, this simple recursion branches into an exponential number of possibilities and may therefore be far too slow to execute. Therefore, you should either memoize the recursion with lru_cache, or even better...
*

*Hint 2*

*Hint 2*

*
Do not use recursion at all but build up a two-dimensional list whose entries are the individual subproblem solutions. Fill in the correct values with two for-loops in some order that guarantees that when these loops arrive at position [x][y], the results for positions [x-1][y] and [x][y-1] needed to compute [x][y] are already there.
*

**Input:** **position** as tuple of two integers (int) and **tabu** as list of positions.

**Output:** Integer (int).

**Examples:**

assert lattice_paths((3, 3), []) == 20 assert lattice_paths((3, 4), [(2, 2)]) == 17 assert lattice_paths((10, 5), [(6, 1), (2, 3)]) == 2063

**Precondition:**

*x >= 0 and y >= 0*.

*The mission was taken from Python CCPS 109. It is taught for Ryerson Chang School of Continuing Education by Ilkka Kokkarinen*

CheckiO Extensions allow you to use local files to solve missions. More info in a blog post.

In order to install CheckiO client you'll need installed Python (version at least 3.8)

Install CheckiO Client first:

pip3 install checkio_client

Configure your tool

checkio --domain=py config --key=

Sync solutions into your local folder

checkio sync

(in beta testing) Launch local server so your browser can use it and sync solution between local file end extension on the fly. (doesn't work for safari)

checkio serv -d

Alternatevly, you can install Chrome extension or FF addon

checkio install-plugin

checkio install-plugin --ff

checkio install-plugin --chromium

Read more here about other functionality that the checkio client provides. Feel free to submit an issue in case of any difficulties.