public RemainderState(int remainder, int distance, int digit, RemainderState previous) { this.Remainder = remainder; this.Distance = distance; this.Digit = digit; this.Previous = previous; }
public static String Construct(int a) { Dictionary <int, RemainderState> states = new Dictionary <int, RemainderState>(); SortedSet <int> queueRemainders = new SortedSet <int>(); Queue <int> queue = new Queue <int>(); RemainderState currentState = new RemainderState(RemainderState.START_REMAINDER, 0, 0, null), oldState; queue.Enqueue(currentState.Remainder); states[currentState.Remainder] = currentState; queueRemainders.Add(currentState.Remainder); while (queue.Count > 0) { currentState = states[queue.Dequeue()]; queueRemainders.Remove(currentState.Remainder); foreach (RemainderState newState in currentState.Visit(a)) { if (states.TryGetValue(newState.Remainder, out oldState)) { if (oldState.Distance > newState.Distance || oldState.Distance == newState.Distance && oldState.Digit > newState.Digit) { states[newState.Remainder] = newState; } } else { states[newState.Remainder] = newState; queue.Enqueue(newState.Remainder); } } } if (states.TryGetValue(0, out currentState)) { StringBuilder sb = new StringBuilder(); while (currentState.Remainder != RemainderState.START_REMAINDER) { sb.Append(currentState.Digit); currentState = currentState.Previous; } return(sb.ToString()); } return("Nope"); }