예제 #1
0
        private void GuessCandidate(PuzzleIterator puzzleIterator, CellValue candidate)
        {
            var cell = new Cell(candidate.Value);

            puzzleIterator.SetCurrent(cell);
            ReduceCandidates();
        }
예제 #2
0
 private bool SolveCellsRecursively(PuzzleIterator puzzleIterator)
 {
     if (FindNextUndefinedCell(puzzleIterator))
     {
         return(TryEachCandidate(puzzleIterator));
     }
     return(PuzzleIsValid());
 }
예제 #3
0
        public bool Solve()
        {
            var puzzleIterator = new PuzzleIterator(_puzzle);

            puzzleIterator.MoveNext();
            ReduceCandidates();

            return(SolveCellsRecursively(new PuzzleIterator(puzzleIterator)));
        }
예제 #4
0
 private bool FindNextUndefinedCell(PuzzleIterator iterator)
 {
     while (iterator.MoveNext())
     {
         if (iterator.Current.Value == CellValue.Unknown.Value)
         {
             return(true);
         }
     }
     return(false);
 }
        public bool PuzzleIsCompleted()
        {
            var iterator = new PuzzleIterator(_puzzle);

            while (iterator.MoveNext())
            {
                if (iterator.Current.Value == 0)
                {
                    return(false);
                }
            }
            return(true);
        }
예제 #6
0
        private bool TryEachCandidate(PuzzleIterator puzzleIterator)
        {
            var memento = _puzzle.CreateMemento();

            var candidates = puzzleIterator.Current.Candidates;

            foreach (var candidate in candidates)
            {
                _puzzle.SetMemento(memento);
                GuessCandidate(puzzleIterator, candidate);
                if (PuzzleIsSolved(puzzleIterator))
                {
                    return(true);
                }
            }
            return(false);
        }
예제 #7
0
        public void SetUp()
        {
            var puzzle = new Puzzle(_testPuzzle);

            _iterator = new PuzzleIterator(puzzle);
        }
예제 #8
0
 private bool PuzzleIsSolved(PuzzleIterator puzzleIterator)
 {
     return(PuzzleIsValid() && SolveCellsRecursively(new PuzzleIterator(puzzleIterator)));
 }