示例#1
0
 private static bool IsValidMove(
     Dictionary <LibraEnum, Stack <int> > libra,
     LibraEnum sideNeedToBeHeavy,
     LibraEnum addToSide,
     int weight)
 {
     return(sideNeedToBeHeavy == GetHeavySide(libra, addToSide, weight));
 }
示例#2
0
 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);
     }
 }
示例#3
0
        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);
            }
        }
示例#4
0
 private static void HandleLibraPop(LibraEnum side, int weight, Dictionary <LibraEnum, Stack <int> > libra)
 {
     libra[side].Pop();
     libra[GetIndexBySide(side)].Pop();
     _sumHelper[GetSumEnumBySide(side)] -= weight;
 }
示例#5
0
 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;
 }
示例#6
0
 private static LibraEnum GetSumEnumBySide(LibraEnum side)
 {
     return((side == LibraEnum.RIGHT_SIDE) ? LibraEnum.RIGHT_SIDE_SUM : LibraEnum.LEFT_SIDE_SUM);
 }
示例#7
0
 private static LibraEnum GetIndexBySide(LibraEnum side)
 {
     return((side == LibraEnum.RIGHT_SIDE) ? LibraEnum.RIGHT_INDEX : LibraEnum.LEFT_INDEX);
 }
示例#8
0
 private static LibraEnum GetOppositeEnum(LibraEnum side)
 {
     return((side == LibraEnum.RIGHT_SIDE) ? LibraEnum.LEFT_SIDE : LibraEnum.RIGHT_SIDE);
 }
示例#9
0
        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);
        }