using System.Collections.Generic;
public static void Main()
Dictionary<string, int> memo = new Dictionary<string, int>();
int result = KnightDial2(6, 2);
int result2 = KnightDial(6, 2, memo);
Console.WriteLine(result);
Console.WriteLine(result2);
public static List<int> GetAdjacentNumbers(int digit)
return new List<int> { 4, 6 };
return new List<int> { 6, 8 };
return new List<int> { 7, 9 };
return new List<int> { 4, 8 };
return new List<int> { 3, 9, 0 };
return new List<int> { 1, 7, 0 };
return new List<int> { 2, 6 };
return new List<int> { 1, 3 };
return new List<int> { 2, 4 };
public static int KnightDial(int digit, int hop, Dictionary<string, int> memo)
string memoKey = digit.ToString() + hop.ToString();
if (memo.ContainsKey(memoKey))
foreach (int next in GetAdjacentNumbers(digit))
sequence += KnightDial(next, hop - 1, memo);
memo[memoKey] = sequence;
public static int KnightDial2(int digit, int hop)
int[] prior = Enumerable.Repeat(1, 10).ToArray();
int [] current = Enumerable.Repeat(1, 10).ToArray();
while (currentHop <= hop)
current = Enumerable.Repeat(0, 10).ToArray();
for (int i = 0; i < 10; ++i)
foreach (int adjacent in GetAdjacentNumbers(i))
current[i] += prior[adjacent];