public static SudokuPuzzle MakeSolvedPuzzle()
        {
            // known solution from: http://www.sudokukingdom.com/images/rules_solved.jpg
            var rows = new SudokuValue[][] {
                new SudokuValue [] { SudokuValue.TWO, SudokuValue.FOUR, SudokuValue.EIGHT, SudokuValue.THREE, SudokuValue.NINE, SudokuValue.FIVE, SudokuValue.SEVEN, SudokuValue.ONE, SudokuValue.SIX },
                new SudokuValue [] { SudokuValue.FIVE, SudokuValue.SEVEN, SudokuValue.ONE, SudokuValue.SIX, SudokuValue.TWO, SudokuValue.EIGHT, SudokuValue.THREE, SudokuValue.FOUR, SudokuValue.NINE },
                new SudokuValue [] { SudokuValue.NINE, SudokuValue.THREE, SudokuValue.SIX, SudokuValue.SEVEN, SudokuValue.FOUR, SudokuValue.ONE, SudokuValue.FIVE, SudokuValue.EIGHT, SudokuValue.TWO },

                new SudokuValue [] { SudokuValue.SIX, SudokuValue.EIGHT, SudokuValue.TWO, SudokuValue.FIVE, SudokuValue.THREE, SudokuValue.NINE, SudokuValue.ONE, SudokuValue.SEVEN, SudokuValue.FOUR },
                new SudokuValue [] { SudokuValue.THREE, SudokuValue.FIVE, SudokuValue.NINE, SudokuValue.ONE, SudokuValue.SEVEN, SudokuValue.FOUR, SudokuValue.SIX, SudokuValue.TWO, SudokuValue.EIGHT },
                new SudokuValue [] { SudokuValue.SEVEN, SudokuValue.ONE, SudokuValue.FOUR, SudokuValue.EIGHT, SudokuValue.SIX, SudokuValue.TWO, SudokuValue.NINE, SudokuValue.FIVE, SudokuValue.THREE },

                new SudokuValue [] { SudokuValue.EIGHT, SudokuValue.SIX, SudokuValue.THREE, SudokuValue.FOUR, SudokuValue.ONE, SudokuValue.SEVEN, SudokuValue.TWO, SudokuValue.NINE, SudokuValue.FIVE },
                new SudokuValue [] { SudokuValue.ONE, SudokuValue.NINE, SudokuValue.FIVE, SudokuValue.TWO, SudokuValue.EIGHT, SudokuValue.SIX, SudokuValue.FOUR, SudokuValue.THREE, SudokuValue.SEVEN },
                new SudokuValue [] { SudokuValue.FOUR, SudokuValue.TWO, SudokuValue.SEVEN, SudokuValue.NINE, SudokuValue.FIVE, SudokuValue.THREE, SudokuValue.EIGHT, SudokuValue.SIX, SudokuValue.ONE }
            };

            var puzzle = new SudokuPuzzle();
            for (int i = 0; i < rows.Length; i++)
            {
                for (int j = 0; j < rows.Length; j++)
                {
                    puzzle.SetValue(i, j, rows[i][j]);
                }
            }

            return puzzle;
        }
Exemple #2
0
 /// <summary> <!-- {{{1 --> Constructor
 /// </summary>
 /// <param name="idx"></param>
 public Cell(SudokuCellIndex idx)
 {
     idx.AssertWhenInvalid();
     this.index     = idx;
     this.candidate = new Candidates();
     this.value     = SudokuValue.NA;
 }
 public SudokuSolverEventArgs(SudokuValue value, int row, int column, SudokuSolverEventArgsAction action = SudokuSolverEventArgsAction.Set)
     : base()
 {
     this.Row = row;
     this.Column = column;
     this.Value = value;
     this.Action = action;
 }
Exemple #4
0
 public void SetValueAtId(int id, SudokuValue value)
 {
     foreach (var group in GetGroupsForId(id))
     {
         group.AvailableValues.Remove(value);
     }
     GetBoxForId(id).SetAssigned(value);
 }
Exemple #5
0
 /// <summary> <!-- {{{1 --> Throw exception when specified value is invalid or N/A.
 /// </summary>
 /// <param name="self"></param>
 public static void AssertWhenInvalidOrNA(this SudokuValue self)
 {
     if (!self.IsValidOrNA())
     {
         var msg = string.Format("Invalid cell value: {0}", self.ToStr());
         throw new ArgumentOutOfRangeException(msg);
     }
 }
Exemple #6
0
 /// <summary> <!-- {{{1 --> Convert SudokuValue to String
 /// </summary>
 /// <param name="self"></param>
 /// <returns></returns>
 public static string ToStr(this SudokuValue self)
 {
     if (self.IsInvalid())
     {
         return(".");
     }
     return(self.ToInt().ToString());
 }
Exemple #7
0
 /// <summary> <!-- {{{1 --> Constructor
 /// </summary>
 /// <param name="initial"></param>
 public Value(SudokuValue initial)
 {
     if (!initial.IsNA() && initial.IsInvalid())
     {
         var msg = string.Format("Invalid value: {0}", initial.ToStr());
         throw new ArgumentOutOfRangeException(msg);
     }
     this.v = initial;
 }
        public SudokuValue[,] FormatSudokuBoard(int[,] board)
        {
            SudokuValue[,] newBoard = new SudokuValue[board.GetLength(0), board.GetLength(1)];

            for (int i = 0; i < board.GetLength(0); i++)
            {
                for (int y = 0; y < board.GetLength(1); y++)
                {
                    bool wasGiven = board[i, y] != 0;

                    newBoard[i, y] = new SudokuValue()
                    {
                        value = board[i, y], wasGiven = wasGiven
                    };
                }
            }

            return(newBoard);
        }
Exemple #9
0
        public void FormatSudokuBoard_BoardFormatted_ReturnsTrue()
        {
            // Arrange
            int[,] unformattedBoard = new int[2, 2] {
                { 1, 0 }, { 3, 4 }
            };
            SudokuValue[,] expected = new SudokuValue[2, 2]
            {
                {
                    new SudokuValue()
                    {
                        value = 1, wasGiven = true
                    },
                    new SudokuValue()
                    {
                        value = 0, wasGiven = false
                    }
                },
                {
                    new SudokuValue()
                    {
                        value = 3, wasGiven = true
                    },
                    new SudokuValue()
                    {
                        value = 4, wasGiven = true
                    }
                }
            };

            // Act
            SudokuValue[,] actual = _service.FormatSudokuBoard(unformattedBoard);

            // Assert
            Assert.IsTrue(_service.CheckIfSudokuBoardsAreEqual(expected, actual));
        }
Exemple #10
0
 /// <summary> <!-- {{{1 --> Return true if the value is same with specified Value instance.
 /// </summary>
 /// <param name="val"></param>
 /// <returns></returns>
 public bool Equals(SudokuValue val)
 {
     return(val == this.value);
 }
Exemple #11
0
 /// <summary> <!-- {{{1 --> Copy value from specified cell value.
 /// </summary>
 /// <param name="val"></param>
 public void CopyFrom(SudokuValue val)
 {
     val.AssertWhenInvalidOrNA();
     this.value = val;
 }
Exemple #12
0
 /// <summary> <!-- {{{1 --> Return true if the value is same with specified value.
 /// </summary>
 /// <param name="src"></param>
 /// <returns></returns>
 public bool Equals(SudokuValue v)
 {
     return(v == this.v);
 }
        private int CountOccurencesInBox(SudokuValue value, int row, int col)
        {
            var count = 0;

            // adjust (0, 1, 2) => 0, (3, 4, 5) => 3, (6, 7, 8) => 6
            row = row - row % NUM_CELLS_PER_BOX;
            col = col - col % NUM_CELLS_PER_BOX;

            for (int i = row; i < row + NUM_CELLS_PER_BOX; i++)
            {
                for (int j = col; j < col + NUM_CELLS_PER_BOX; j++)
                {
                    if (this.CurrentBoard[i][j] == value)
                    {
                        count++;
                    }
                }
            }

            return count;
        }
        public bool IsValidValue(SudokuValue sudokuValue, int row, int col)
        {
            if (this.IsValueInRow(sudokuValue, row) || this.IsValueInColumn(sudokuValue, col) || this.IsValueInBox(sudokuValue, row, col))
            {
                return false;
            }

            return true;
        }
Exemple #15
0
 /// <summary> <!-- {{{1 --> Convert SudokuValue to Integer
 /// </summary>
 /// <param name="self"></param>
 /// <returns></returns>
 public static int ToInt(this SudokuValue self)
 {
     return((int)self);
 }
Exemple #16
0
 /// <summary> <!-- {{{1 --> Return true if the value is valid or NA.
 /// </summary>
 /// <param name="self"></param>
 /// <returns></returns>
 public static bool IsValidOrNA(this SudokuValue self)
 {
     return(self.IsValid() || self.IsNA());
 }
Exemple #17
0
 /// <summary> <!-- {{{1 --> Return true if the value is valid.
 /// </summary>
 /// <param name="self"></param>
 /// <returns></returns>
 public static bool IsValid(this SudokuValue self)
 {
     return(!self.IsInvalid());
 }
Exemple #18
0
 /// <summary> <!-- {{{1 --> Return true if the value is invalid.
 /// </summary>
 /// <param name="self"></param>
 /// <returns></returns>
 public static bool IsInvalid(this SudokuValue self)
 {
     return((SudokuValue._1 > self) || (SudokuValue._9 < self));
 }
Exemple #19
0
 /// <summary> <!-- {{{1 --> Return true if the value is not available.
 /// </summary>
 /// <param name="self"></param>
 /// <returns></returns>
 public static bool IsNA(this SudokuValue self)
 {
     return(SudokuValue.NA == self);
 }
        private void NotifyCallback(SudokuValue value, int row, int col, SudokuSolverEventArgsAction action)
        {
            if (this.Callback != null)
            {
                var args = new SudokuSolverEventArgs(value, row, col, action);
                this.Callback.Invoke(this, args);

                if (args.Delay > 0)
                {
                    Thread.Sleep(args.Delay);
                }
            }
        }
        private int CountOccurencesInRow(SudokuValue value, int row)
        {
            var count = 0;

            for (int i = 0; i < NUM_ROWS; i++)
            {
                if (this.CurrentBoard[row][i] == value)
                {
                    count++;
                }
            }

            return count;
        }
 private bool IsValueInColumn(SudokuValue value, int col)
 {
     return this.CountOccurencesInColumn(value, col) > 0;
 }
 public void SetValue(int row, int col, SudokuValue value)
 {
     this.CurrentBoard[row][col] = value;
 }
Exemple #24
0
 /// <summary> <!-- {{{1 --> Remove specified candidate
 /// </summary>
 /// <param name="v"></param>
 /// <returns></returns>
 public bool Remove(SudokuValue v)
 {
     return(!values.Remove(v));
 }
        private int CountOccurencesInColumn(SudokuValue value, int col)
        {
            var count = 0;

            for (int i = 0; i < NUM_ROWS; i++)
            {
                if (this.CurrentBoard[i][col] == value)
                {
                    count++;
                }
            }

            return count;
        }
Exemple #26
0
 /// <summary> <!-- {{{1 --> Copy members from specified Value instance.
 /// </summary>
 /// <param name="src"></param>
 public void CopyFrom(Value src)
 {
     this.v = src.v;
 }
 private bool IsValueInBox(SudokuValue value, int row, int col)
 {
     return this.CountOccurencesInBox(value, row, col) > 0;
 }
Exemple #28
0
 public void SetAssigned(SudokuValue value)
 {
     Assigned = value;
 }
 private bool IsValueInRow(SudokuValue value, int row)
 {
     return this.CountOccurencesInRow(value, row) > 0;
 }
Exemple #30
0
 /// <summary> <!-- {{{1 --> Add specified candidate
 /// </summary>
 /// <param name="v"></param>
 /// <returns></returns>
 public bool Add(SudokuValue v)
 {
     return(!values.Add(v));
 }