void find_next_continuation(const board_t* board, size_t* i_row, size_t* i_col, digits_t* digits) { size_t i, j, best_row, best_col; digits_t tmp_digits, best_digits; int min_possibilities = NO_MOVE_POSSIBLE; for (i = 0; i < NROWS; i++) { for (j = 0; j < NCOLS; j++) { if (EMPTY == get_digit(board, i, j)) { count_digits(board, i, j, &tmp_digits); int n_possible = count_possibilities(&tmp_digits); assert(n_possible > 0); assert(n_possible < NDIGITS); if (n_possible < min_possibilities) { min_possibilities = n_possible; best_row = i; best_col = j; best_digits = tmp_digits; } } } } assert(min_possibilities != NO_MOVE_POSSIBLE); memcpy(digits, &best_digits, sizeof(digits_t)); *i_row = best_row; *i_col = best_col; }
bool is_dead_end(const board_t* board) { size_t i, j; bool dead_end = false; for (i = 0; (i < NROWS) && (!dead_end); i++) { for (j = 0; (j < NCOLS) && (!dead_end); j++) { field_t value = get_digit(board, i, j); debugf("[%u,%u] == %d\n", i, j, value); if (EMPTY == value) { digits_t digits; count_digits(board, i, j, &digits); int n_possibilities = count_possibilities(&digits); if (0 == n_possibilities) { dead_end = true; debugf("[%lu,%lu] = %d, dead end\n", i, j, value); } } } } return dead_end; }
static int try_possibility(char pattern[9][9], char possibilities[9][9][9]) { int iterations = 0; bool solved = false; int lowestx = 0; int lowesty = 0; int lowest = 9; for (int x = 0; x < 9; x++) { for (int y = 0; y < 9; y++) { if (pattern[x][y] == ' ') { if (lowest > count_possibilities(possibilities, x, y)) { lowest = count_possibilities(possibilities, x, y); lowestx = x; lowesty = y; } } } } if (lowest != 9) { while ((lowest > 0) && (!solved)) { iterations++; char testpattern[9][9]; char testpossibilities[9][9][9]; bool loadprob = false; for (int x = 0; x < 9; x++) { for (int y = 0; y < 9; y++) { testpattern[x][y] = pattern[x][y]; for (int z = 0; z < 9; z++) { testpossibilities[x][y][z] = possibilities[x][y][z]; if ((x == lowestx) && (lowesty == y) && (possibilities[x][y][z] != ' ') && (!loadprob)) { testpattern[x][y] = possibilities[x][y][z]; possibilities[x][y][z] = ' '; testpossibilities[x][y][z] = ' '; loadprob = true; } } } } printf("\n===\n"); print_pattern(testpattern); printf("\n===\n"); switch(check_solved_legal(testpattern)) { case 1 : solved = true; print_pattern(testpattern); printf("\nSolved!\n"); printf("\nIterations: %d\n", iterations); end = clock(); time_spent = (double)(end - begin) / CLOCKS_PER_SEC; printf("\nTime to run: %f\n", time_spent); exit(EXIT_SUCCESS); return iterations; case -1 : printf("\nillegal moves\n"); break; case 0 : iterations += try_possibility(testpattern, testpossibilities); } lowest--; } } return iterations; }