コード例 #1
0
        public static SudokuPlayer Create(Definition.Sudoku originSudoku, Definition.Sudoku playingSudoku)
        {
            if (playingSudoku == null)
            {
                throw new ArgumentNullException("playingSudoku");
            }

            return((SudokuPlayer)app.Dispatcher.Invoke((Func <SudokuPlayer>) delegate
            {
                return new SudokuPlayer(originSudoku, playingSudoku);
            }));
        }
コード例 #2
0
        public SudokuSolverPartternBase(Definition.Sudoku sudoku)
        {
            if (sudoku == null)
            {
                throw new ArgumentNullException("sudoku");
            }
            this.sudoku = sudoku;

            this.observers = registerObservers(sudoku).ToArray();
            this.validator = new SudokuValidator(sudoku);

            this.name = this.GetType().Name;
        }
コード例 #3
0
        public SudokuSolver(Definition.Sudoku sudoku)
        {
            if (sudoku == null)
            {
                throw new ArgumentNullException("sudoku");
            }
            if (!sudoku.Validate())
            {
                throw new ArgumentException("Invalid Sudoku. Duplicated element found");
            }

            this.sudoku          = sudoku;
            this.completionState = new Observers.CompletionStateObserver(sudoku);
        }
コード例 #4
0
        public bool Build(Definition.Sudoku sudoku)
        {
            if (sudoku == null)
            {
                throw new ArgumentNullException("sudoku");
            }

            //Console.WriteLine("Grid 1, 5, 9");
            fullRandomGrid(sudoku.Grid1, elementsInOrder.OrderBy(item => rnd.Next()));
            fullRandomGrid(sudoku.Grid5, elementsInOrder.OrderBy(item => rnd.Next()));
            fullRandomGrid(sudoku.Grid9, elementsInOrder.OrderBy(item => rnd.Next()));

            //Console.WriteLine("Grid 3");
            if (!randomGrid3(sudoku.Grid1, sudoku.Grid3, sudoku.Grid9))
            {
                return(false);
            }

            //Console.WriteLine("Grid 7");
            if (!randomGrid7(sudoku.Grid1, sudoku.Grid7, sudoku.Grid9))
            {
                return(false);
            }

            //Console.WriteLine("Grid 2");
            if (!randomGrid2(sudoku.Grid1, sudoku.Grid2, sudoku.Grid3, sudoku.Grid5))
            {
                return(false);
            }

            //Console.WriteLine("Grid 4");
            if (!randomGrid4(sudoku.Grid1, sudoku.Grid4, sudoku.Grid5, sudoku.Grid7))
            {
                return(false);
            }

            //Console.WriteLine("Grid 6");
            if (!randomGrid6(sudoku.Grid3, sudoku.Grid4, sudoku.Grid5, sudoku.Grid6, sudoku.Grid9))
            {
                return(false);
            }

            //Console.WriteLine("Grid 8");
            if (!randomGrid8(sudoku.Grid2, sudoku.Grid5, sudoku.Grid7, sudoku.Grid8, sudoku.Grid9))
            {
                return(false);
            }

            return(true);
        }
コード例 #5
0
 protected override IEnumerable <Observers.ObserverBase> registerObservers(Definition.Sudoku sudoku)
 {
     foreach (var lineObserver in sudoku.Rows.Concat(sudoku.Columns)
              .Select(item => new Observers.LineObserver(item, Observers.SeatMode.Two)))
     {
         if (lineObserver.IsIdle)
         {
             lineObserver.Dispose();
         }
         else
         {
             lineObserver.Updated += onLineUpdated;
             yield return(lineObserver);
         }
     }
 }
コード例 #6
0
 protected override IEnumerable <Observers.ObserverBase> registerObservers(Definition.Sudoku sudoku)
 {
     foreach (var gridLineObserver in new GridEnumerable(sudoku)
              .Select(item => new Observers.GridObserver(item, Observers.SeatMode.All)))
     {
         if (gridLineObserver.IsIdle)
         {
             gridLineObserver.Dispose();
         }
         else
         {
             gridLineObserver.Updated += onGridUpdated;
             yield return(gridLineObserver);
         }
     }
 }
コード例 #7
0
        public void InvalidSudoku()
        {
            var sudoku = new Definition.Sudoku();

            foreach (var grid in sudoku.Grids)
            {
                for (int i = 0; i < 3; i++)
                {
                    for (int j = 1; j <= 3; j++)
                    {
                        grid.Rows[i].Elements[j - 1].SetValue(3 * i + j);
                    }
                }
            }

            Assert.IsFalse(sudoku.Validate());
        }
コード例 #8
0
        private bool trySolveInBranch(out Definition.Sudoku completedSudoku)
        {
            foreach (var branchSolver in new Branch.SudokuSolveBranch(sudoku))
            {
                using (branchSolver)
                {
                    if (branchSolver.TrySolve())
                    {
                        completedSudoku = branchSolver.sudoku;
                        return(true);
                    }
                }
            }

            completedSudoku = null;
            return(false);
        }
コード例 #9
0
        public SudokuValueSyncBase(Definition.Sudoku defSudoku, Model.Sudoku sudoku)
        {
            if (defSudoku == null)
            {
                throw new ArgumentNullException("defSudoku");
            }
            if (sudoku == null)
            {
                throw new ArgumentNullException("sudoku");
            }

            this.defSudoku = defSudoku;
            this.sudoku    = sudoku;

            foreach (var grid in defSudoku.Grids)
            {
                foreach (var element in grid.Elements)
                {
                    element.ValueChanged += onElementValueChanged;
                }
            }
        }
コード例 #10
0
        public CompletionStateObserver(Definition.Sudoku sudoku)
        {
            if (sudoku == null)
            {
                throw new ArgumentNullException("sudoku");
            }
            this.sudoku = sudoku;

            foreach (var gridObserver in sudoku.Grids
                     .Select(item => new GridObserver(item, SeatMode.All)))
            {
                if (gridObserver.IsIdle)
                {
                    gridObserver.Dispose();
                    this.completedGridCount++;
                }
                else
                {
                    gridObserver.Updated += onGridUpdated;
                    this.gridObservers.Add(gridObserver);
                }
            }
        }
コード例 #11
0
        public Definition.Sudoku Build(DifficultLevel difficultLevel)
        {
            if (difficultLevel == null)
            {
                throw new ArgumentNullException("difficultLevel");
            }

            Console.WriteLine("Difficulty: {0}", difficultLevel.Difficulty);

            int level = difficultLevel.Level;

            Definition.Sudoku targetSudoku = this.source.Copy();

            int seatsCount = 0;

            for (int i = 0; i < level; i++)
            {
                while (true)
                {
                    var element = GetNextElement(targetSudoku);
                    if (element.HasValue)
                    {
                        element.ClearValue();
                        seatsCount++;
                        break;
                    }
                }
            }

            if (seatsCount != level)
            {
                throw new Exception(
                          string.Format("Expected:\t{0} seats\r\nActually:\t{1} seats", level, seatsCount));
            }

            return(targetSudoku);
        }
コード例 #12
0
        private IEnumerable <SudokuSolver> BranchSolverIterator(Definition.Sudoku sudoku)
        {
            int seatCount = -1;
            IEnumerable <Definition.Element> branchBasedElements = null;

            for (int i = 2; i <= SEAT_UPPER_BOUND; i++)
            {
                if (tryFindBranchBasedElements(sudoku, i, out branchBasedElements))
                {
                    seatCount = i;
                    break;
                }
            }

            if (seatCount < 0)
            {
                yield break;
            }

            var branchBasedEmptyElements = branchBasedElements.NotValued();

            var remainderValues = branchBasedElements
                                  .Values()
                                  .SudokuExcept();

            foreach (var values in new HeapFullPermutationEnumerable <int>(remainderValues))
            {
                var branchSudoku   = sudoku.Copy();
                var branchElements = branchBasedEmptyElements
                                     .Select(item => branchSudoku.Grids[item.GridIndex].Elements[item.Index]);

                using (var validator = new SudokuValidator(branchSudoku))
                {
                    using (var valueIterator = values.GetEnumerator())
                        using (var elementIterator = branchElements.GetEnumerator())
                        {
                            while (valueIterator.MoveNext() && elementIterator.MoveNext())
                            {
                                var currentElement = elementIterator.Current;
                                var currentValue   = valueIterator.Current;

                                //var fillingLog = string.Format("{0, -30}: ({1}, {2}) - {3}",
                                //	"new branch",
                                //	currentElement.GridIndex + 1,
                                //	currentElement.Index + 1,
                                //	currentValue);

                                currentElement.SetValue(currentValue);

                                if (validator.HasFailed)
                                {
                                    break;
                                }
                                //else
                                //	Console.WriteLine(fillingLog);
                            }
                        }

                    if (!validator.HasFailed)
                    {
                        yield return(new SudokuSolver(branchSudoku));
                    }
                }
            }
        }
コード例 #13
0
 public TwoSeatsInLine(Definition.Sudoku sudoku)
     : base(sudoku)
 {
 }
コード例 #14
0
 public AnySeatInGridLineType2(Definition.Sudoku sudoku)
     : base(sudoku)
 {
 }
コード例 #15
0
 protected abstract IEnumerable <Observers.ObserverBase> registerObservers(Definition.Sudoku sudoku);
コード例 #16
0
 public SudokuStepSync(Definition.Sudoku defSudoku, Model.Sudoku sudoku)
     : base(defSudoku, sudoku)
 {
 }
コード例 #17
0
 public OneSeatInNine(Definition.Sudoku sudoku)
     : base(sudoku)
 {
 }
コード例 #18
0
 public SudokuPlayerController(Definition.Sudoku originSudoku, Definition.Sudoku playingSudoku)
 {
     this.window = SudokuPlayer.Create(originSudoku, playingSudoku);
 }
コード例 #19
0
 protected override IEnumerable <Observers.ObserverBase> registerObservers(Definition.Sudoku sudoku)
 {
     //not observer in this parttern
     yield break;
 }
コード例 #20
0
        public bool TrySolve()
        {
            var sudoku          = this.sudoku;
            var completionState = this.completionState;

            if (completionState.IsCompleted)             //the sudoku might be already completed
            {
                return(true);
            }

            int lastSeatsRemainder = completionState.SeatsRemainder();

            while (true)
            {
                using (var oneSeatInNineParttern = new Pattern.OneSeatInNine(sudoku))
                    using (var oneSeatInGridLinePattern = new Pattern.OneSeatInGridLine(sudoku))
                        using (var oneSearInGridLinePattern2 = new Pattern.OneSeatInGridLineType2(sudoku))
                            //using (var anySeatInGridLinePattern = new Pattern.AnySeatInGridLine(sudoku))
                            using (var twoSeatsInLinePattern = new Pattern.TwoSeatsInLine(sudoku))
                                using (var anySeatInGridLinePattern2 = new Pattern.AnySeatInGridLineType2(sudoku))
                                {
                                    var patterns = new Pattern.SudokuSolverPartternBase[]
                                    {
                                        oneSeatInNineParttern,
                                        oneSeatInGridLinePattern,
                                        oneSearInGridLinePattern2,
                                        //anySeatInGridLinePattern,
                                        twoSeatsInLinePattern,
                                        anySeatInGridLinePattern2
                                    };
                                    foreach (var pattern in patterns.OrderBy(item => item.Index))
                                    {
                                        pattern.Fill();
                                        if (pattern.HasFailed)
                                        {
                                            return(false);
                                        }
                                        if (completionState.IsCompleted)
                                        {
                                            return(true);
                                        }
                                    }
                                }

                int currentSeatsRemainder = completionState.SeatsRemainder();
                if (currentSeatsRemainder != lastSeatsRemainder)
                {
                    lastSeatsRemainder = currentSeatsRemainder;
                }
                else
                {
                    break;
                }
            }

            //still not solved, use branch
            Definition.Sudoku completedSudoku = null;
            if (trySolveInBranch(out completedSudoku))
            {
                sudoku.UpdateByValued(completedSudoku);
                return(true);
            }
            return(false);
        }