예제 #1
0
        /// <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);
        }
예제 #2
0
    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);
    }
예제 #3
0
    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);
        }
    }