Sitemap
Alfonso Baqueiro Bernal

Alfonso Baqueiro Bernal

Member-only story

Knight Dialer problem

3 min readAug 13, 2026

https://leetcode.com/problems/knight-dialer/description/

Resolver este problemita si me esta constando un poco de trabajo:

Mi primer aproximación, fue un desastre y solo la pense para n=2, así que no vale ni la pena ponerla, y no usaba recursión. Tarde un monton en llegar a ella, 12 horas dormido y otras 5 despierto.

La segunda aproximación, me tomo 30 minutos, y use recursión para recorrer el arbol combinatorio, funciona, pero está limitada por el limite de pila de llamadas, que es de 1000, aunque en la práctica el tiempo de recorrido se vuelve algo desesperante a partir de n=22.

#!/usr/local/bin/python

# https://leetcode.com/problems/knight-dialer/

import time

keys = ['1','2','3','4','5','6','7','8','9','0']

options = {
'1': ['6','8']
, '2': ['7','9']
, '3': ['4','8']
, '4': ['3','9','0']
, '6': ['1','7','0']
, '7': ['2','6']
, '8': ['1','3']
, '9': ['2','4']
, '0': ['4','6']
}

class Solution:
def knightDialer(self, n: int, imprimir=False) -> int:
r = 0

def iterar(combo, pos):
nonlocal r
if pos == 0:
col = list(options.keys())
else:
col = options[ combo[pos-1] ]
for e in col:
combo[pos] = e
if pos == n-1:
if imprimir: print(combo)
r += 1
else:
iterar(combo, pos+1)

if n == 1:
combo = [None] * n
for e in keys:
combo[0] = e
if imprimir: print(combo)
r += 1
else:
combo = [None] * n
iterar(combo, 0)

if imprimir:
print()
print(f'{r:,}')
return r

sol = Solution()
#assert sol.knightDialer(1) = 10…

--

--