protected Sudoku.Core.Sudoku SolveOriginalCleanup(Sudoku.Core.Sudoku instance) { BoolExpr instance_c = GetPuzzleConstraint(instance); var z3Solver = GetSolver(); z3Solver.Assert(GenericContraints); z3Solver.Assert(instance_c); if (z3Solver.Check() == Status.SATISFIABLE) { Model m = z3Solver.Model; for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { if (instance.GetCell(i, j) == 0) { instance.SetCell(i, j, ((IntNum)m.Evaluate(X[i][j])).Int); } } } } else { Console.WriteLine("Failed to solve sudoku"); } return(instance); }
protected Sudoku.Core.Sudoku SolveWithScope(Sudoku.Core.Sudoku instance) { var z3Solver = GetReusableSolver(); z3Solver.Push(); BoolExpr instance_c = GetPuzzleConstraint(instance); z3Solver.Assert(instance_c); if (z3Solver.Check() == Status.SATISFIABLE) { Model m = z3Solver.Model; for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { if (instance.GetCell(i, j) == 0) { instance.SetCell(i, j, ((IntNum)m.Evaluate(X[i][j])).Int); } } } } else { Console.WriteLine("Failed to solve sudoku"); } z3Solver.Pop(); return(instance); }
public Sudoku.Core.Sudoku Solve(Sudoku.Core.Sudoku s) { int[,] instance = new int[9, 9]; for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { instance[i, j] = s.GetCell(i, j); } } IntExpr[,] R = SudokuExample(instance); var listCells = new List <int>(81); for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { listCells.Add(((IntNum)R[i, j]).Int); } } return(new Sudoku.Core.Sudoku(listCells)); }
protected Sudoku.Core.Sudoku SolveWithSubstitutions(Sudoku.Core.Sudoku instance) { var substExprs = new List <Expr>(); var substVals = new List <Expr>(); for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { if (instance.GetCell(i, j) != 0) { substExprs.Add(X[i][j]); substVals.Add(z3Context.MkInt(instance.GetCell(i, j))); } } } BoolExpr instance_c = (BoolExpr)GenericContraints.Substitute(substExprs.ToArray(), substVals.ToArray()); var z3Solver = GetSolver(); z3Solver.Assert(instance_c); if (z3Solver.Check() == Status.SATISFIABLE) { Model m = z3Solver.Model; for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { if (instance.GetCell(i, j) == 0) { instance.SetCell(i, j, ((IntNum)m.Evaluate(X[i][j])).Int); } } } } else { Console.WriteLine("Failed to solve sudoku"); } return(instance); }
Sudoku.Core.Sudoku SudokuExample(Sudoku.Core.Sudoku instance) { BoolExpr instance_c = _ctx.MkTrue(); for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { instance_c = _ctx.MkAnd(instance_c, (BoolExpr) _ctx.MkITE(_ctx.MkEq(_ctx.MkInt(instance.GetCell(i, j)), _ctx.MkInt(0)), _ctx.MkTrue(), _ctx.MkEq(X[i][j], _ctx.MkInt(instance.GetCell(i, j))))); } } Solver s = _ctx.MkSolver(); s.Assert(sudoku_c); s.Assert(instance_c); if (s.Check() == Status.SATISFIABLE) { Model m = s.Model; for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { instance.SetCell(i, j, ((IntNum)m.Evaluate(X[i][j])).Int); } } return(instance); } else { Console.WriteLine("Failed to solve sudoku"); return(instance); } }
BoolExpr GetPuzzleConstraint(Sudoku.Core.Sudoku instance) { BoolExpr instance_c = z3Context.MkTrue(); for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { if (instance.GetCell(i, j) != 0) { instance_c = z3Context.MkAnd(instance_c, (BoolExpr) z3Context.MkEq(X[i][j], z3Context.MkInt(instance.GetCell(i, j)))); } } } return(instance_c); }
protected Sudoku.Core.Sudoku SolveOriginalVersion(Sudoku.Core.Sudoku instance) { BoolExpr instance_c = z3Context.MkTrue(); for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { instance_c = z3Context.MkAnd(instance_c, (BoolExpr) z3Context.MkITE(z3Context.MkEq(z3Context.MkInt(instance.GetCell(i, j)), z3Context.MkInt(0)), z3Context.MkTrue(), z3Context.MkEq(X[i][j], z3Context.MkInt(instance.GetCell(i, j))))); } } Solver s = z3Context.MkSolver(); s.Assert(GenericContraints); s.Assert(instance_c); if (s.Check() == Status.SATISFIABLE) { Model m = s.Model; for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { instance.SetCell(i, j, ((IntNum)m.Evaluate(X[i][j])).Int); } } return(instance); } else { Console.WriteLine("Failed to solve sudoku"); return(instance); } }
public Sudoku.Core.Sudoku Solve(Sudoku.Core.Sudoku sudoku) { //Sudoku -> Tableau int[,] sudokuInGrid = new int[9, 9]; for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { sudokuInGrid[i, j] = sudoku.GetCell(i, j); } } Solver solver = new Solver("Sudoku"); int cell_size = 3; IEnumerable <int> CELL = Enumerable.Range(0, cell_size); int n = cell_size * cell_size; IEnumerable <int> RANGE = Enumerable.Range(0, n); //Création de la grille de solution IntVar[,] grid = solver.MakeIntVarMatrix(n, n, 1, 9, "grid"); IntVar[] grid_flat = grid.Flatten(); //Tableau -> Solver foreach (int i in RANGE) { foreach (int j in RANGE) { if (sudokuInGrid[i, j] > 0) { solver.Add(grid[i, j] == sudokuInGrid[i, j]); } } } //Un chiffre ne figure qu'une seule fois par ligne/colonne/cellule foreach (int i in RANGE) { // Lignes solver.Add((from j in RANGE select grid[i, j]).ToArray().AllDifferent()); // Colonnes solver.Add((from j in RANGE select grid[j, i]).ToArray().AllDifferent()); } //Cellules foreach (int i in CELL) { foreach (int j in CELL) { solver.Add((from di in CELL from dj in CELL select grid[i * cell_size + di, j * cell_size + dj] ).ToArray().AllDifferent()); } } //Début de la résolution DecisionBuilder db = solver.MakePhase(grid_flat, Solver.INT_VAR_SIMPLE, Solver.INT_VALUE_SIMPLE); solver.NewSearch(db); // Solver -> Liste var gridToSudoku = new List <int>(); while (solver.NextSolution()) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { gridToSudoku.Add((int)grid[i, j].Value()); } } } solver.EndSearch(); //Liste -> Sudoku return(new Sudoku.Core.Sudoku(gridToSudoku)); }