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