Esempio n. 1
0
        public SudokuSolution Solve()
        {
            _solutionSteps.Clear();
            _solutionSteps.Add(solutionStep(StepType.InitialBoard));


            while (board.Any(s => s.IsAnyDirty))
            {
                while (board.Any(s => s.IsDirty(StepType.SingletonSearch)) ||
                       board.Any(s => s.IsDirty(StepType.UnarySpotSearch)) ||
                       board.Any(s => s.IsDirty(StepType.AmbiguousLinearExclusion)) ||
                       board.Any(s => s.IsDirty(StepType.PointingTuples)) ||
                       board.Any(s => s.IsDirty(StepType.HiddenTuples)))
                {
                    while (board.Any(s => s.IsDirty(StepType.SingletonSearch)) ||
                           board.Any(s => s.IsDirty(StepType.UnarySpotSearch)))
                    {
                        while (board.Any(s => s.IsDirty(StepType.SingletonSearch)))
                        {
                            RunSingletonSearch();
                        }
                        while (board.Any(s => s.IsDirty(StepType.UnarySpotSearch)))
                        {
                            RunUnarySearch();
                        }
                    }
                    while (board.Any(s => s.IsDirty(StepType.AmbiguousLinearExclusion)))
                    {
                        RunAmbiguousAlignmentExclusion();
                    }
                    //foreach (var square in board)
                    //{
                    //    square.SetDirty(StepType.PointingTuples);
                    //}
                    while (board.Any(s => s.IsDirty(StepType.PointingTuples)))
                    {
                        RunPointingTuples();
                    }
                    while (board.Any(s => s.IsDirty(StepType.HiddenTuples)))
                    {
                        RunHiddenTuples();
                    }
                }
                while (board.Any(s => s.IsDirty(StepType.NAryAmbiguousLinearExclusion)))
                {
                    RunNAryAbmiguousLinearExclusion();
                }
            }


            return(new SudokuSolution
            {
                Steps = _solutionSteps
            });
        }