private static List<Sudoku> LoadSudokuData() { List<Sudoku> games = new List<Sudoku>(); if (useExample) { Sudoku game = new Sudoku("003020600900305001001806400008102900700000008006708200002609500800203009005010300"); games.Add(game); } else { string fileText = System.IO.File.ReadAllText("..\\..\\data096.txt"); string[] lines = fileText.Split('\n'); string gameData = ""; int countlines = 0; foreach (string line in lines) { if (!line.Contains("Grid")) { gameData += line.Substring(0, 9); // strip off any trailing characters! countlines++; } if (countlines == 9) { Sudoku game = new Sudoku(gameData); games.Add(game); countlines = 0; gameData = ""; } } } return games; }
public bool SolveSudoku(int thisProblemNumber, bool debug) { PrintBig(originalData); // we'll start at the beginning and // use solvedData as our work area. for (int x = 0; x < 9; x++) { for (int y = 0; y < 9; y++) { solvedData[x, y] = new SudokuCell(originalData[x, y].Number, x, y); } } int round = 1; int thisRoundNumLeft = -1; int lastRoundNumLeft = -1; do { //Check Horizontals for (int row = 0; row < 9; row++) { // get list of cells for this column List<SudokuCell> cells = GetCellGroupingFor(solvedData[0, row], CellGroupingType.Horizontal); // apply logic to this independant grouping NarrowDownIndependantCellGrouping(cells, CellGroupingType.Horizontal); } //Check Verticals for (int col = 0; col < 9; col++) { // get list of cells for this column List<SudokuCell> cells = GetCellGroupingFor(solvedData[col, 0], CellGroupingType.Vertical); // apply logic to this independant grouping NarrowDownIndependantCellGrouping(cells, CellGroupingType.Vertical); } // Check Square Groups for (int gridRow = 0; gridRow < 3; gridRow++) { for (int gridCol = 0; gridCol < 3; gridCol++) { // create a list of cells for this group List<SudokuCell> cells = GetCellGroupingFor(solvedData[gridCol * 3, gridRow * 3], CellGroupingType.Square); // apply logic to this independant grouping NarrowDownIndependantCellGrouping(cells, CellGroupingType.Square); } } // **** NOTE **** // SEE: http://www.sudokuessentials.com/sudoku_tips.html // **** NOTE **** if (debug) { Console.WriteLine("After Round {0}:", round); PrintBig(solvedData); } thisRoundNumLeft = CountNumberLeft(solvedData); round++; if (thisRoundNumLeft == lastRoundNumLeft) { Console.WriteLine("!!!!!!!!!!!!!!!!! Not making any headway on {0} !!!!!!!!", thisProblemNumber); if (debug) PrintBig(solvedData); if (CheckValid()) { bool guessedCorrect = false; // now make guesses and solve each guess for (int row = 0; row < 10; row++) { if (guessedCorrect) break; for (int col = 0; col < 10; col++) { if (guessedCorrect) break; if (solvedData[col, row].Number == 0) { for (int i = 1; i < 10; i++) { string theseUsed = solvedData[col, row].Possibilities; if (theseUsed.Substring(i, 1) != "-") { Sudoku newPuzzle = new Sudoku(solvedData); newPuzzle.originalData[col, row].Number = i; guessedCorrect = newPuzzle.SolveSudoku(thisProblemNumber, debug); if (guessedCorrect) { solvedData = newPuzzle.solvedData; } } if (guessedCorrect) break; } } } } } break; } lastRoundNumLeft = thisRoundNumLeft; } while (!IsCompletelySolved); if (!debug) PrintBig(solvedData); return CheckValid(); }