我会使用动态编程。首先,建立一个地图,列出每个步骤可以到达的数字,然后回溯以找出如何到达那里:
void CalculateRoute(int targetNumber, int numSteps){ int maxValue = targetNumber * 16; bool[,] reachable = new bool[numSteps + 1, maxValue]; // build up the map reachable[0, 0] = true; for (int step = 0; step < numSteps; step++) { for (int n = 0; n < maxValue; n++) { if (reachable[step, n]) { foreach (int nextNum in ReachableNumbersFrom(n)) { if (nextNum < maxValue && nextNum >= 0) reachable[step + 1, nextNum] = true; } } } } // figure out how we got there int current = targetNumber; for (int step = numSteps; step >= 0; step--) { Console.WriteLine(current); bool good = false; foreach (int prev in ReachableNumbersFromReverse(current)) { if (reachable[step, prev]) { current = prev; good = true; break; } } if (!good) { Console.WriteLine("Unable to proceed"); break; } }}IEnumerable<int> ReachableNumbersFrom(int n){ // additions for (int i = 1; i <= 15; i++) yield return n + i; // mults/divides yield return n / 2; yield return n / 4; yield return n * 2; yield return n * 4;}IEnumerable<int> ReachableNumbersFromReverse(int n){ // additions for (int i = 1; i <= 15; i++) yield return n - i; // mults/divides if (n % 2 == 0) yield return n / 2; if (n % 4 == 0) yield return n / 4; yield return n * 2; yield return n * 4;}


