package net.jankenpoi.sudokuki.generator;\r
\r
import net.jankenpoi.sudokuki.SudokuGrid;\r
+import net.sourceforge.plantuml.sudoku.DLXEngine;\r
\r
public abstract class SudokuGenerator {\r
\r
protected static void printGrid(int[] tab) {\r
for (int i = 0; i < tab.length; i++) {\r
- if (i % 3 == 0)\r
- System.out.print(" ");\r
- if (i % 9 == 0)\r
- System.out.println();\r
- if (i % 27 == 0)\r
- System.out.println();\r
- System.out.print("" + (tab[i] == 0 ? "-" : Integer.valueOf(tab[i])));\r
+ if (i % 3 == 0) {\r
+ if (DLXEngine.DBG) {\r
+ System.out.print(" ");\r
+ }\r
+ }\r
+ if (i % 9 == 0) {\r
+ if (DLXEngine.DBG) {\r
+ System.out.println();\r
+ }\r
+ }\r
+ if (i % 27 == 0) {\r
+ if (DLXEngine.DBG) {\r
+ System.out.println();\r
+ }\r
+ }\r
+ if (DLXEngine.DBG) {\r
+ System.out.print("" + (tab[i] == 0 ? "-" : Integer.valueOf(tab[i])));\r
+ }\r
+ }\r
+ if (DLXEngine.DBG) {\r
+ System.out.println();\r
}\r
- System.out.println();\r
}\r
\r
public abstract SudokuGrid generateGrid(final int minRating, final int maxRating);\r
import java.io.FileOutputStream;
import java.io.IOException;
-import java.util.Date;
import java.util.Random;
/*******************************************************************************
* puzzle
*/
String solve(String puzzle) {
- System.out.println("puzzle = "+puzzle);
+ if (DLXEngine.DBG) {
+ System.out.println("puzzle = "+puzzle);
+ }
String result = new String();
int STATE = M6;
solutions++;
if (solutions >= smax) {
- System.out.println("smax xolutions found");
+ if (DLXEngine.DBG) {
+ System.out.println("smax xolutions found");
+ }
if (_try_ == 1)
- System.out.print("+");
+ if (DLXEngine.DBG) {
+ System.out.print("+");
+ }
STATE = NEXT_TRY;
break;
}
if (tnodes > vmax) {
if (_try_ == 1)
- System.out.print("-");
+ if (DLXEngine.DBG) {
+ System.out.print("-");
+ }
STATE = NEXT_TRY;
break;
}
yy = solutions;
for (i = 1; i < 33; i++)
yy = yy * xx;
- System.out.println("clues: " + clues + " estimated solutions:" + yy + " time " + x1 + "ms");
+ if (DLXEngine.DBG) {
+ System.out.println("clues: " + clues + " estimated solutions:" + yy + " time " + x1 + "ms");
+ }
STATE = END;
break;
break;
}
if (p == 6) {
- System.out.println(solutions);
+ if (DLXEngine.DBG) {
+ System.out.println(solutions);
+ }
STATE = END;
break;
}
if (p == 0 || p == 1) {
- System.out.println(solutions + " solution(s), rating " + (100 * tnodes) + ", time " + x1 + "ms");
+ if (DLXEngine.DBG) {
+ System.out.println(solutions + " solution(s), rating " + (100 * tnodes) + ", time " + x1 + "ms");
+ }
}
if (p > 5) {
x = 0;
for (i = 1; i <= N4; i++) {
x += Node[i];
- System.out.print(Node[i]);
+ if (DLXEngine.DBG) {
+ System.out.print(Node[i]);
+ }
if (i % 9 == 0)
- System.out.println();
+ if (DLXEngine.DBG) {
+ System.out.println();
+ }
+ }
+ if (DLXEngine.DBG) {
+ System.out.println(x);
}
- System.out.println(x);
}
STATE = END;
break;
static final int END = 20;
static final int M6 = 21;
- /** Set to true to generate debug output */
- boolean DBG = true;
-
/** Output trace messages */
void dbg(String s) {
- if (DBG)
+ if (DLXEngine.DBG) {
System.out.println(s);
+ }
}
private final Random random;
if (fi > 0)
if ((nt / z) > fi) {
- for (i = 1; i <= 81; i++)
- System.out.println(L[A[i]]);
- System.out.println();
+ for (i = 1; i <= 81; i++) {
+ if (DLXEngine.DBG) {
+ System.out.println(L[A[i]]);
+ }
+ }
+ if (DLXEngine.DBG) {
+ System.out.println();
+ }
STATE = M6;
break;
}
}
if ((z & 1) > 0) {
- System.out.println(nt / z);
+ if (DLXEngine.DBG) {
+ System.out.println(nt / z);
+ }
STATE = M6;
break;
}
- if (rate > 1)
- System.out.println("hint: " + H[mi2]);
+ if (rate > 1) {
+ if (DLXEngine.DBG) {
+ System.out.println("hint: " + H[mi2]);
+ }
+ }
STATE = END;
break;
}
}
-/**
- *
- * @author Rolf Sandberg
- */
-
-class xxxDLXEngine {
- dlx_generator generator;
- dlx_solver solver;
-
- public xxxDLXEngine(Random random) {
- generator = new dlx_generator(random);
- solver = new dlx_solver(random);
- }
-
- String generate(int minrating, int maxrating) {
- // Date t = new Date();
- // long start = t.getTime();
- // int tries = 0, i, samples = 5;
- // long rating = 0;
- String ss[] = generator.generate(1, 0);
- return ss[0];
-
- // Generator:
- // First arg: rand seed
- // Second arg: #samples, ignored if <= 0
- // Third arg: rating and hints, ignored if <= 0
-
- // Task: Find a Sudoku with a rating in a specified interval.
- // Do it by generating samples and examine them
- // Continue until an appropriate puzzle is found.
- // while(tries < 9999999) {
- // tries++;
- // t = new Date();
- // ss = generator.generate(samples, 0);
- // for(i = 0; i < samples; i++) {
- // rating = generator.rate(ss[i].replace("\n","").trim());
- // if(rating > minrating && rating < maxrating) {
- // return ss[i];
- // }
- // }
- // System.out.println(minrating + ", " + maxrating + ", " + rating + ",
- // looping");
- // }
- // return ss[0];
- }
-
- long rate(String s) {
- return generator.rate(s);
- }
-
- String solve(String s) {
- String result = solver.solve(s);
- return result;
- }
-}
-
public class DLXEngine {
+ /** Set to true to generate debug output */
+ public static boolean DBG = false;
+
dlx_generator generator;
dlx_solver solver;
for(i = 0; i < samples; i++) {
rating = generator.rate(ss[i].replace("\n","").trim());
if(rating > minrating && rating < maxrating) {
- System.out.println(minrating + ", " + maxrating + ", " + rating);
+ if (DLXEngine.DBG) {
+ System.out.println(minrating + ", " + maxrating + ", " + rating);
+ }
return ss[i];
}
}