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; } }