/// <summary> /// Solve the grid /// </summary> public void Solve() { Lock(); int[,] sodukuGrid = new int[9, 9]; for (int i = 0; i < 9; ++i) { for (int j = 0; j < 9; ++j) { sodukuGrid[i, j] = this[i, j]; } } SudokuSolver solver = new SudokuSolver(sodukuGrid); solutions = solver.Solve(); //Grid is invalid if (solutions.Count != 1) { for (int i = 0; i < 9; ++i) { for (int j = 0; j < 9; ++j) { if (this[i, j] == 0) { this[i, j] = -1; } } } return; } for (int i = 0; i < 9; ++i) { for (int j = 0; j < 9; ++j) { this[i, j] = solutions[0][i, j]; } } }
/// <summary> /// Solve the grid /// </summary> /// <returns>List of the solutions</returns> public List <int[, ]> Solve() { List <int[, ]> gridRules = new List <int[, ]>(); while (IsValid && !IsFilled) { // Detect the box to be filled IEnumerable <BoxInformation> boxesToBeFilled = DetectBoxesToBeFilled().Values; // If no boxes, then make hypothesis if (boxesToBeFilled.Count() == 0) { IEnumerable <BoxInformation> hypothesis = GetHypothesis(); for (int n = 1; n < hypothesis.Count(); ++n) { var rule = new SudokuSolver(grid); rule[hypothesis.ElementAt(n).Row, hypothesis.ElementAt(n).Col] = hypothesis.ElementAt(n).Figure; gridRules.AddRange(rule.Solve()); } this[hypothesis.ElementAt(0).Row, hypothesis.ElementAt(0).Col] = hypothesis.ElementAt(0).Figure; continue; } // Fill the boxes Parallel.ForEach(boxesToBeFilled, info => { this[info.Row, info.Col] = info.Figure; }); } if (IsValid) { gridRules.Add(grid); } return(gridRules); }