}
}
if (verbose) {
- std::cout << "Solved " << solved << " numbers\n";
+ //std::cout << "Solved " << solved << " numbers\n";
}
return solved;
return min;
}
-sudoku sudoku::solve(int &solvable)
+std::vector<sudoku> sudoku::solve_all()
{
- int x, y, i, ret;
+ int x, y, i, j, ret;
std::string str;
- sudoku empty;
+ std::vector<sudoku> sudokus;
// Fill in as much as possible
do {
switch (ret) {
case -1:
// Unsolvable
- solvable = 0;
if (verbose) {
std::cout << "This is unsolvable, recursion: "
<< recursion_depth << std::endl;
}
- return empty;
+ return sudokus;
case 0:
// Solved
- solvable = 1;
if (verbose) {
std::cout << "Solution found , recursion: "
<< recursion_depth << std::endl;
}
- return *this;
+ sudokus.push_back(*this);
+ print();
+ return sudokus;
}
if (verbose) {
// Try guessim something
str = get_legal_numbers(x, y);
for (i = 0; i < (int)str.length(); i++) {
+ std::vector<sudoku> results;
sudoku guess = *this;
- guess.set(x, y, str[i]);
+ guesses++;
if (verbose) {
std::cout << "Guessing number " << str[i] << " to "
<< x << "." << y << std::endl;
}
-
+
+ guess.set(x, y, str[i]);
guess.recursion_depth = recursion_depth + 1;
+ guess.guesses = 0;
- int can_solve;
- guess = guess.solve(can_solve);
+ results = guess.solve_all();
+ guesses += guess.guesses;
//Did it solve?
- if (can_solve)
- return guess;
+ if (!results.empty()) {
+/* printf("Got %d solutions, guessed %d: %s\n",
+ (int)results.size(), (int)str.size(),
+ str.c_str());*/
+
+ for(j = 0;j < (int)results.size(); j++) {
+ sudokus.push_back(results.at(j));
+ guesses += results.at(j).guesses;
+ }
+ }
}
- // It didn't solve
- solvable = 0;
- return empty;
+ std::cout << "Guesses: " << guesses << std::endl;
+
+ // Return what was solved
+ return sudokus;
}
-std::vector<sudoku> sudoku::solve_all()
+sudoku sudoku::fill_with_random(int &solvable)
{
- int x, y, i, j, ret;
+ int x, y, i, ret;
std::string str;
- std::vector<sudoku> sudokus;
+ sudoku empty;
// Fill in as much as possible
do {
if (verbose) {
- std::cout << std::endl;
- print();
+ //std::cout << std::endl;
+ //print();
}
} while (fill_missing() != 0);
ret = get_best_guess(x, y);
- // Did we solve it yet?
+ // Did we fill it yet?
switch (ret) {
case -1:
// Unsolvable
+ solvable = 0;
if (verbose) {
- std::cout << "This is unsolvable, recursion: "
- << recursion_depth << std::endl;
+ //std::cout << "This is unsolvable, recursion: "
+ // << recursion_depth << std::endl;
}
- return sudokus;
+ return empty;
case 0:
// Solved
+ solvable = 1;
if (verbose) {
- std::cout << "Solution found , recursion: "
- << recursion_depth << std::endl;
+ //std::cout << "Solution found , recursion: "
+ // << recursion_depth << std::endl;
}
- sudokus.push_back(*this);
- print();
- return sudokus;
+ return *this;
}
if (verbose) {
- std::cout << "Not solved yet, guessing at depth "
- << recursion_depth << std::endl;
+ //std::cout << "Not solved yet, guessing at depth "
+ // << recursion_depth << std::endl;
}
- // Try guessim something
+ // Try filling with something
str = get_legal_numbers(x, y);
- for (i = 0; i < (int)str.length(); i++) {
- std::vector<sudoku> results;
+ while (str.length()) {
+ i = get_random() % str.length();
sudoku guess = *this;
- guesses++;
+ guess.set(x, y, str[i]);
if (verbose) {
- std::cout << "Guessing number " << str[i] << " to "
- << x << "." << y << std::endl;
+ //std::cout << "Trying number " << str[i] << " to "
+ // << x << "." << y << std::endl;
}
- guess.set(x, y, str[i]);
guess.recursion_depth = recursion_depth + 1;
- guess.guesses = 0;
- results = guess.solve_all();
- guesses += guess.guesses;
-
- //Did it solve?
- if (!results.empty()) {
-/* printf("Got %d solutions, guessed %d: %s\n",
- (int)results.size(), (int)str.size(),
- str.c_str());*/
+ int can_solve;
+ guess = guess.fill_with_random(can_solve);
- for(j = 0;j < (int)results.size(); j++) {
- sudokus.push_back(results.at(j));
- guesses += results.at(j).guesses;
- }
+ //Did it solve?
+ if (can_solve) {
+ solvable = 1;
+ return guess;
}
- }
- std::cout << "Guesses: " << guesses << std::endl;
+ str.erase(i,1);
+ }
- // Return what was solved
- return sudokus;
+ // It didn't solve
+ solvable = 0;
+ return empty;
}
-void sudoku::generate(int min_guesses)
+int sudoku::generate(int min_guesses)
{
+ int solvable;
+ sudoku tmp = fill_with_random(solvable);
+
+ if (solvable)
+ *this = tmp;
+ return solvable;
}