private void ExecuteStartCommand() { BeginStack.Clear(); AuxStack.Clear(); EndStack.Clear(); IsSolved = false; InitPushIntoBeginStack(); PegState = SourcePegState.BEGIN; UpdateCollectionAsync(); SolveTowersOfHanoi(); }
async Task UpdateCollectionAsync() { Task t = Task.Delay(3000); BeginCollection.Clear(); AuxCollection.Clear(); EndCollection.Clear(); BeginStack.ToList().ForEach((x) => BeginCollection.Add(x)); AuxStack.ToList().ForEach((x) => AuxCollection.Add(x)); EndStack.ToList().ForEach((x) => EndCollection.Add(x)); await t; }
private void InitPushIntoBeginStack() { BeginStack.Push(3); BeginStack.Push(2); BeginStack.Push(1); }
async Task SolveTowersOfHanoi() { if (IsSolved) { return; } await UpdateCollectionAsync(); //Done State if (EndStack.Count == INIT_DISK_LEN) { IsSolved = true; return; } switch (PegState) { case SourcePegState.BEGIN: // END , AUX if (BeginStack.Count > 0) { if (EndStack.Count == 0 || CanPush(BeginStack.Peek(), EndStack.Peek())) { EndStack.Push(BeginStack.Pop()); SolveTowersOfHanoi(); } else if (AuxStack.Count == 0 || CanPush(BeginStack.Peek(), AuxStack.Peek())) { AuxStack.Push(BeginStack.Pop()); //PegState = SourcePegState.BEGIN; SolveTowersOfHanoi(); } else { PegState = SourcePegState.END; SolveTowersOfHanoi(); } } else { PegState = SourcePegState.END; SolveTowersOfHanoi(); } break; case SourcePegState.AUXILLARY: // BEGIN, END if (AuxStack.Count > 0) { if (BeginStack.Count == 0 || CanPush(AuxStack.Peek(), BeginStack.Peek())) { BeginStack.Push(AuxStack.Pop()); SolveTowersOfHanoi(); } else if (EndStack.Count == 0 || CanPush(AuxStack.Peek(), EndStack.Peek())) { EndStack.Push(AuxStack.Pop()); SolveTowersOfHanoi(); } else { PegState = SourcePegState.BEGIN; SolveTowersOfHanoi(); } } else { PegState = SourcePegState.BEGIN; SolveTowersOfHanoi(); } break; case SourcePegState.END: //Lock State if (EndStack.Count > 0) { //max elem if (EndStack.Peek() == 3) //&& EndStack.Count == 1) { //state transition to Aux PegState = SourcePegState.AUXILLARY; SolveTowersOfHanoi(); return; } } //AUX, BEGIN if (EndStack.Count > 0) { if (AuxStack.Count == 0 || CanPush(EndStack.Peek(), AuxStack.Peek())) { AuxStack.Push(EndStack.Pop()); SolveTowersOfHanoi(); } else if (BeginStack.Count == 0 || CanPush(EndStack.Peek(), BeginStack.Peek())) { BeginStack.Push(EndStack.Pop()); SolveTowersOfHanoi(); } else { PegState = SourcePegState.BEGIN; SolveTowersOfHanoi(); } } else { PegState = SourcePegState.BEGIN; SolveTowersOfHanoi(); } break; default: break; } }