Fastest path on a snakes and ladders board
Don't use mutable default arguments. If you need to default to a list then default to None and then change to an empty list.

Take the following example code:

&gt;&gt;&gt; def example_list_builder(value, list_=[]):
    list_.append(value)
    return list_

&gt;&gt;&gt; example_list_builder(1)
[1]
&gt;&gt;&gt; example_list_builder(2)
[1, 2]


This makes list_ a really poorly defined singleton variable, that can't be accessed globally.



Your code looks like it's something like \$O(6^n)\$ where \$n\$ is the size of the board.

You can instead make it \$O(l^2)\$ where \$l\$ is LADDERS and SNAKES.

To improve your code, you should remove the simulation and instead only work with the LADDERS and SNAKES variables.

For each snake and ladder you should traverse it, and then traverse the snake or ladder after this. You should note the distance, there are two ways to do this:


Least tiles visited.
Least turns taken.


For the latter, you'll have to check for collisions with other snakes and ladders.

You should take snakes into account, as the fastest path for the following is 4 turns:

NUMBER_SQUARES = 1000
LADDERS = {1: 502, 501: 999}
SNAKES = {503: 500}