private static bool IsValidMove( Dictionary <LibraEnum, Stack <int> > libra, LibraEnum sideNeedToBeHeavy, LibraEnum addToSide, int weight) { return(sideNeedToBeHeavy == GetHeavySide(libra, addToSide, weight)); }
private static void SolveLibra( Queue <int> weightStack, Dictionary <LibraEnum, Stack <int> > libra, string rightLeftString, int counter) { for (int i = 0; i < weightStack.Count && !_isFinished; i++) { int weight = weightStack.Dequeue(); LibraEnum sideNeedToBeHeavy = CharToLibraSideEnum(rightLeftString[0]); if (IsValidMove(libra, sideNeedToBeHeavy, GetOppositeEnum(sideNeedToBeHeavy), weight)) { HandleLibraMove(GetOppositeEnum(sideNeedToBeHeavy), weight, weightStack, libra, rightLeftString, counter); } if (!_isFinished && IsValidMove(libra, sideNeedToBeHeavy, sideNeedToBeHeavy, weight)) { HandleLibraMove(sideNeedToBeHeavy, weight, weightStack, libra, rightLeftString, counter); } weightStack.Enqueue(weight); } }
private static void HandleLibraMove( LibraEnum side, int weight, Queue <int> weightStack, Dictionary <LibraEnum, Stack <int> > libra, string rightLeftString, int counter) { HandleLibraPush(side, weight, libra, counter); if (!weightStack.Any()) { _isFinished = true; return; } SolveLibra(weightStack, libra, rightLeftString.Substring(1, rightLeftString.Length - 1), ++counter); if (!_isFinished) { HandleLibraPop(side, weight, libra); } }
private static void HandleLibraPop(LibraEnum side, int weight, Dictionary <LibraEnum, Stack <int> > libra) { libra[side].Pop(); libra[GetIndexBySide(side)].Pop(); _sumHelper[GetSumEnumBySide(side)] -= weight; }
private static void HandleLibraPush(LibraEnum side, int weight, Dictionary <LibraEnum, Stack <int> > libra, int counter) { libra[side].Push(weight); libra[GetIndexBySide(side)].Push(counter); _sumHelper[GetSumEnumBySide(side)] += weight; }
private static LibraEnum GetSumEnumBySide(LibraEnum side) { return((side == LibraEnum.RIGHT_SIDE) ? LibraEnum.RIGHT_SIDE_SUM : LibraEnum.LEFT_SIDE_SUM); }
private static LibraEnum GetIndexBySide(LibraEnum side) { return((side == LibraEnum.RIGHT_SIDE) ? LibraEnum.RIGHT_INDEX : LibraEnum.LEFT_INDEX); }
private static LibraEnum GetOppositeEnum(LibraEnum side) { return((side == LibraEnum.RIGHT_SIDE) ? LibraEnum.LEFT_SIDE : LibraEnum.RIGHT_SIDE); }
private static LibraEnum GetHeavySide(Dictionary <LibraEnum, Stack <int> > libra, LibraEnum addToSide, int weight) { int addToSideSum = _sumHelper[GetSumEnumBySide(addToSide)] + weight; int oppositeSideSum = _sumHelper[GetSumEnumBySide(GetOppositeEnum(addToSide))]; if (addToSideSum > oppositeSideSum) { return(addToSide); } else if (addToSideSum < oppositeSideSum) { return(GetOppositeEnum(addToSide)); } return(LibraEnum.EQUAL); }