Example #1
0
        private bool CheckForLastMissingPart(SumCell sumCell, int sum, GameCell[] parts, Direction direction)
        {
            var unSolvedCells = new List <GameCell>();

            foreach (var gameCell in parts)
            {
                if (gameCell.IsSolved)
                {
                    var gameCellValue = gameCell.Value;
                    sumCell.AddAlreadySolved(gameCellValue, direction);
                    sum -= gameCellValue;
                }
                else
                {
                    unSolvedCells.Add(gameCell);
                }
            }

            var unSolvedCount = unSolvedCells.Count;

            if (unSolvedCount == 1)
            {
                unSolvedCells[0].MarkAsSolved(sum);
                return(true);
            }

            if (unSolvedCount > 1)
            {
                if (EliminatePossibilitiesBasedOnRemainingUnSolvedSubset(sum, unSolvedCount, unSolvedCells))
                {
                    return(true);
                }

                var possibleSets  = NumberSets[NumberSet.KeyFrom(unSolvedCount, sum)].Sets;
                var alreadySolved = sumCell.GetAlreadySolved(direction);

                var remainingPossibleSets = possibleSets.Where(x => !x.Intersect(alreadySolved).Any());

                // foreach (var set in remainingPossibleSets)
                // {
                //     foreach (var value in set)
                //     {
                //         foreach (var unSolvedCell in unSolvedCells)
                //         {
                //             unSolvedCell.IsTheValuePossibleSolution(value);
                //         }
                //     }
                // }
            }

            return(false);
        }
Example #2
0
        private bool EliminateNeverUsedNumbers(SumCell sumCell, string lookupKey, GameCell[] partCells, Direction direction)
        {
            foreach (var gameCell in partCells.Where(x => x.IsSolved))
            {
                sumCell.AddAlreadySolved(gameCell.Value, direction);
            }

            var neverUsed       = NumberSets[lookupKey].NeverUsed;
            var alreadySolved   = sumCell.GetAlreadySolved(direction);
            var eliminationList = neverUsed.Union(alreadySolved);

            var anythingSolved = false;

            foreach (var gameCell in partCells.Where(x => !x.IsSolved))
            {
                if (gameCell.EliminateTheNumbers(eliminationList.ToArray()))
                {
                    anythingSolved = true;
                }
            }
            return(anythingSolved);
        }