import jp.ac.kobe_u.cs.cream.DefaultSolver; import jp.ac.kobe_u.cs.cream.IntVariable; import jp.ac.kobe_u.cs.cream.Network; import jp.ac.kobe_u.cs.cream.NotEquals; import jp.ac.kobe_u.cs.cream.Solution; import jp.ac.kobe_u.cs.cream.Solver; public class Sudoku { public static void main(String[] args) { long start = System.currentTimeMillis(); // Cream CSP netwerk Network net = new Network(); // Een Sudoku speelveld bestaat uit 9 rijen en 9 kolommen. IntVariable[][] s = new IntVariable[9][9]; for (int r = 0; r < 9; r++) { for (int c = 0; c < 9; c++) { s[r][c] = new IntVariable(net); } } // Elk veld moet een waarde tussen 1 en 9 hebben for (int r = 0; r < 9; r++) { for (int c = 0; c < 9; c++) { s[r][c].ge(1); s[r][c].le(9); } } // Elke waarde in een rij moet uniek zijn for (int r = 0; r < 9; r++) { new NotEquals(net, s[r]); } // Elke waarde in een kolom moet uniek zijn for (int c = 0; c < 9; c++) { for (int r = 0; r < 9; r++) { for (int rx = r + 1; rx < 9; rx++) { s[r][c].notEquals(s[rx][c]); } } } // Het speelveld is onderverdeeld in 3x3 subvelden van 3 rijen en 3 // kolommen // Elke waarde in een subveld moet uniek zijn for (int br = 0; br < 9; br += 3) { for (int bc = 0; bc < 9; bc += 3) { for (int r = br; r < br + 3; r++) { for (int c = bc; c < bc + 3; c++) { for (int rx = r; rx < br + 3; rx++) { for (int cx = c; cx < bc + 3; cx++) { if (cx != c && rx != r) { s[r][c].notEquals(s[rx][cx]); } } } } } } } // Elke Sudoku begint met een aantal gegeven startwaarden s[0][0].equals(2); s[0][1].equals(9); s[0][4].equals(4); s[1][1].equals(7); s[1][5].equals(9); s[1][6].equals(4); s[1][8].equals(1); s[2][2].equals(3); s[2][6].equals(7); s[2][8].equals(2); s[3][5].equals(8); s[3][7].equals(6); s[4][0].equals(6); s[4][3].equals(4); s[4][6].equals(8); s[4][7].equals(1); s[5][2].equals(4); s[5][3].equals(9); s[5][4].equals(3); s[6][2].equals(6); s[6][3].equals(1); s[6][8].equals(5); s[7][5].equals(2); s[7][6].equals(1); s[8][1].equals(8); s[8][2].equals(5); s[8][3].equals(7); s[8][7].equals(2); s[8][8].equals(3); // initialiseer de solver en print oplossing(en) Solver solver = new DefaultSolver(net); for (solver.start(); solver.waitNext(); solver.resume()) { Solution solution = solver.getSolution(); for (int r = 0; r < 9; r++) { for (int c = 0; c < 9; c++) { int v = solution.getIntValue(s[r][c]); System.out.print(v + " "); } System.out.println(); } System.out.println(); } long stop = System.currentTimeMillis(); System.out.println("Aantal oplossingen: " + solver.getCount()); solver.stop(); System.out.println("Oplostijd: " + (stop - start) + "ms"); } }