/// <summary>
        /// Solves a sudoku board.
        /// </summary>
        /// <param name="board">The board to solve.</param>
        /// <param name="index">The zero-based index up to 99.</param>
        /// <returns>True if the board was solved.</returns>
        private static bool Solve(SudokuBoard board, int index)
        {
            if (index == 9 * 9)
            {
                return(true);
            }

            SudokuSquare square        = board.Squares[index / 9];
            int          inSquareIndex = index % 9;

            for (int i = 1; i <= 9; i++)
            {
                square.Values[inSquareIndex] = i;

                if (board.IsValid(index))
                {
                    bool solved = SudokuSolver.Solve(board, index + 1);

                    if (solved)
                    {
                        return(true);
                    }
                }
            }

            square.Values[inSquareIndex] = 0;
            return(false);
        }
Example #2
0
        public static SudokuResult Solve(string puzzle)
        {
            puzzle = puzzle.Replace('.', '0');
            var puzzleArray = puzzle.ToCharArray().Select(e => e - '0').ToArray();
            var grid        = new List <SudokuSquare>();
            int row         = 0;
            int col         = 0;

            // loop through every square
            for (int i = 0; i < puzzle.Length; i++)
            {
                var square = new SudokuSquare(col, row, puzzleArray[i]);
                grid.Add(square);
                col++;
                if (col > 8)
                {
                    row++;
                    col = 0;
                }
            }

            var gridArray = grid.ToArray();

            if (TrySolve(gridArray))
            {
                return(new SudokuResult
                {
                    Solved = true,
                    Puzzle = string.Join("", gridArray.Select(e => e.Value))
                });
            }
            ;

            return(new SudokuResult());
        }
            public bool IsValid(int index)
            {
                SudokuSquare square        = this.Squares[index / 9];
                int          inSquareIndex = index % 9;
                int          value         = square.Values[inSquareIndex];

                if (!square.IsValidValue(inSquareIndex, value))
                {
                    return(false);
                }

                return(this.IsValidValueInRowAndColumn(index, value));
            }
Example #4
0
        public void SwitchValueTest()
        {
            SudokuSquare square1 = new SudokuSquare(0, 0, 0);
            SudokuSquare square2 = new SudokuSquare(0, 1, 0);

            square1.ValueSet += square2.RemovePossibleValue;
            square1.ValueUnset += square2.AddPossibleValue;

            square2.ValueSet += square1.RemovePossibleValue;
            square2.ValueUnset += square1.AddPossibleValue;

            square1.Value = 3;
            Assert.IsFalse(square2.PossibleValues.Contains(3));
            square1.Value = 4;
            Assert.IsTrue(square2.PossibleValues.Contains(3));
            Assert.IsFalse(square2.PossibleValues.Contains(4));
        }
Example #5
0
        public void MultipleValueSwitchTest()
        {
            SudokuSquare[] squares = new SudokuSquare[9];
            for(int i = 0; i < 9; i++)
            {
                squares[i] = new SudokuSquare(0, 0, 0);
            }
            foreach (var square in squares)
            {
                var otherSquares = from s in squares
                                   where s != square
                                   select s;
                foreach (var otherSquare in otherSquares)
                {
                    square.ValueSet += otherSquare.RemovePossibleValue;
                    square.ValueUnset += otherSquare.AddPossibleValue;
                }
            }

            squares[0].Value = 4;
            squares[1].Value = 9;
            squares[2].Value = 8;
            squares[3].Value = 6;
            squares[4].Value = 1;
            squares[5].Value = 2;
            squares[6].Value = 3;
            squares[7].Value = 7;
            squares[8].Value = 5;

            squares[8].Value = 6;
            squares[5].Value = 9;
            squares[3].Value = null;
            squares[1].Value = null;

            Assert.IsTrue(squares[3].PossibleValues.Contains(2));
            Assert.IsTrue(squares[3].PossibleValues.Contains(5));
            Assert.IsTrue(squares[1].PossibleValues.Contains(2));
            Assert.IsTrue(squares[1].PossibleValues.Contains(5));

            squares[3].Value = 5;

            Assert.AreEqual(2, squares[1].Value);
        }
Example #6
0
 void InsertRandomN()
 {
     for (int i = 0; i < board.Length; i++)
     {
         for (int j = 0; j < board[i].Length; j++)
         {
             counter++;
             var obj = Instantiate(Cell, new Vector3(i * 2f, j * 2f), Quaternion.identity) as GameObject;
             obj.transform.parent = gameObject.transform;
             sudokuSquare = obj.GetComponent<SudokuSquare>();
             if (sudokuSquare)
             {
                sudokuSquare.correctNum = faceValues[i][j];
                sudokuSquare.ID = counter;
             }
             else
                 Debug.Log("help");
         }
     }
 }
Example #7
0
 void InsertRandomN()
 {
     for (int i = 0; i < board.Length; i++)
     {
         for (int j = 0; j < board[i].Length; j++)
         {
             counter++;
             var obj = Instantiate(Cell, new Vector3(i * 2f, j * 2f), Quaternion.identity) as GameObject;
             obj.transform.parent = gameObject.transform;
             sudokuSquare         = obj.GetComponent <SudokuSquare>();
             if (sudokuSquare)
             {
                 sudokuSquare.correctNum = faceValues[i][j];
                 sudokuSquare.ID         = counter;
             }
             else
             {
                 Debug.Log("help");
             }
         }
     }
 }
Example #8
0
        public void UnsetEventTest()
        {
            SudokuSquare square1 = new SudokuSquare(0, 0, 0);
            SudokuSquare square2 = new SudokuSquare(0, 1, 0);
            SudokuSquare square3 = new SudokuSquare(0, 2, 0);

            square1.ValueSet += square2.RemovePossibleValue;
            square1.ValueSet += square3.RemovePossibleValue;
            square1.ValueUnset += square2.AddPossibleValue;
            square1.ValueUnset += square3.AddPossibleValue;

            square2.ValueSet += square1.RemovePossibleValue;
            square2.ValueSet += square3.RemovePossibleValue;
            square2.ValueUnset += square1.AddPossibleValue;
            square2.ValueUnset += square3.AddPossibleValue;

            square3.ValueSet += square2.RemovePossibleValue;
            square3.ValueSet += square1.RemovePossibleValue;
            square3.ValueUnset += square2.AddPossibleValue;
            square3.ValueUnset += square1.AddPossibleValue;

            square1.Value = 3;
            Assert.IsFalse(square2.PossibleValues.Contains(3));
            Assert.IsFalse(square3.PossibleValues.Contains(3));
            square2.Value = 4;
            Assert.IsFalse(square3.PossibleValues.Contains(4));
            square1.Value = null;
            Assert.IsTrue(square3.PossibleValues.Contains(3));
            Assert.IsFalse(square1.PossibleValues.Contains(4));
            square2.Value = null;
            Assert.IsTrue(square3.PossibleValues.Contains(4));
            Assert.IsTrue(square1.PossibleValues.Contains(4));
            Assert.IsTrue(square2.PossibleValues.Contains(3));
        }