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