void sudoku::print(void)
{
- int x,y;
+ int x, y;
printf("+-------+------+--------+\n");
for (y = 0; y < 9; y++) {
}
}
-void sudoku::clone_to(sudoku &to)
+void sudoku::print_compact(void)
{
- sudoku clone;
- int x, y;
+ int x, y, i = 0;
+ char str[82];
+ str[81] = 0;
- for (x = 0; x < 9; x++)
- for (y = 0; y < 9; y++)
- to.table[x][y] = table[x][y];
+ for (y = 0; y < 9; y++)
+ for (x = 0; x < 9; x++, i++)
+ str[i] = table[x][y] != EMPTY ? table[x][y] : '.';
+
+ printf("%s\n", str);
}
std::string sudoku::get_row_contents(int row)
int count = used_numbers();
sudoku result;
int stop = 0;
+ sudoku work = *this;
-#pragma omp parallel for firstprivate(stop)
+#pragma omp parallel for firstprivate(stop, work)
for (int i = 0; i < count; i++) {
int x, y;
- sudoku tmp = *this, tmp2;
+ sudoku tmp,tmp2;
std::vector<sudoku> results;
if (done || stop)
do {
x = get_random() % 9;
y = get_random() % 9;
- } while(tmp.get(x,y) == EMPTY);
- tmp.table[x][y] = EMPTY;
+ } while(work.get(x,y) == EMPTY);
+ work.table[x][y] = EMPTY;
//printf("Got now:\n");
- //tmp.print();
+ //work.print();
- tmp2 = tmp;
+ tmp2 = work;
/* solve it */
- results = tmp.solve_all();
+ results = work.solve_all();
/* Does it still have only one solution */
if (results.size() == 1 && !done) {
/* but not hard enough yet? */
- if (tmp.guesses >= min_guesses) {
+ if (work.guesses >= min_guesses) {
/* It's good now */
printf("%d, Good!\n", depth);
- result = tmp;
+ result = work;
done = 1;
#pragma omp flush(done)
} else {
- printf("%2d, got only %3d guesses\n", depth,
- tmp.guesses);
+ printf("%2d, got only %3d guesses ", depth,
+ work.guesses);
+ tmp2.print_compact();
}
if (!done) {
- tmp = tmp2;
- tmp2 = tmp.remove_randomly(min_guesses,
+ work = tmp2;
+ tmp = work.remove_randomly(min_guesses,
depth + 1);
/* test for emptiness */
- if (tmp2.guesses == 0) {
+ if (tmp.guesses == 0) {
continue;
}
- if (tmp2.guesses >= min_guesses) {
- result = tmp2;
+ if (tmp.guesses >= min_guesses) {
+ result = tmp;
done = 1;
#pragma omp flush(done)
} else {