/// <summary> /// Solve sudoku by Brute Force (recursively). /// /// Algorithm: /// Create object of internal class SudokuNode as a root of recursive method.If the sudoku is not wrong call /// 'solve' method the root object. /// </summary> /// <param name="sudoku">Sudoku object to solve.</param> /// <param name="solveOne">Parameter to enable finishing function after writing one value to a cell.</param> /// <returns>True if sudoku was solved. Otherwise False.</returns> public override bool Solve(Sudoku sudoku, bool solveOne = false) { _Root = new SudokuNode(sudoku); SudokuNode.SudokuSolved = null; if (!sudoku.IsWrong()) { _Root.Solve(); if (SudokuNode.SudokuSolved != null) { sudoku.CopyFrom(SudokuNode.SudokuSolved); return(true); } } return(false); }
public bool InitializeGrid(TextBox[,] textBoxes, Label statusLabel, Label timeLabel) //Return true if everything is ok, false if error { stopwatch.Restart(); statusText = statusLabel; timeText = timeLabel; statusText.Text = "Initializing"; for (int x = 0; x < 9; x++) //Setup the 2d grid from text boxes nad check for errors { for (int y = 0; y < 9; y++) { int u = 0; if (Int32.TryParse(textBoxes[x, y].Text, out u)) { if (u < 0 || u > 9) //Found an invalid number { textBoxes[x, y].BackColor = System.Drawing.Color.Red; statusText.Text = "Error"; stopwatch.Stop(); return(false); } else { nodeArray[x, y] = new SudokuNode(u, x, y); } } else { nodeArray[x, y] = new SudokuNode(0, x, y); } } } StartSolving(); return(true); }
public bool StartBruteForcing() { SudokuNode[,] bruteForceArray = new SudokuNode[9, 9]; bruteForceArray = nodeArray; List <SudokuNode> emptyNodes = new List <SudokuNode>(); for (int y = 0; y < 9; y++) //Get all empty nodes that need to be publicated { for (int x = 0; x < 9; x++) { if (bruteForceArray[x, y].nodeNumber == 0) { emptyNodes.Add(bruteForceArray[x, y]); } } } bool end = false; int lastCahngedIndex = -1; while (!end) //Bruteforcing loop { if (lastCahngedIndex == emptyNodes.Count - 1) { end = true; } else { lastCahngedIndex++; bool foundANumber = false; for (int i = emptyNodes[lastCahngedIndex].nodeNumber + 1; i < 10; i++) //Increment the thing by minimum amount { if (i != 0) { if (CanSetHere(emptyNodes[lastCahngedIndex].positionX, emptyNodes[lastCahngedIndex].positionY, i, bruteForceArray)) { emptyNodes[lastCahngedIndex].nodeNumber = i; foundANumber = true; break; } } } if (!foundANumber) //Didnt find a number, backtrack and change others { emptyNodes[lastCahngedIndex].nodeNumber = 0; lastCahngedIndex -= 2; } } } if (SudokuSolved(bruteForceArray)) //If solved { nodeArray = bruteForceArray; return(true); } else //Not solved { return(false); } }