static puzzle_t *search(puzzle_t *puz) { if (!propogate(puz)) { return NULL; } if (solved(puz)) { return puz; } // find best candidate square_t *best = find_search_candidate(puz); char *old_vals = strndup(best->vals, NUM_DIGITS); assert(strlen(old_vals) == strlen(best->vals)); int val; for (val = 0; val < strlen(old_vals); val++) { puzzle_t *copy = copy_puzzle(puz); assert(copy != puz); copy->squares[best->row][best->col].vals[0] = old_vals[val]; copy->squares[best->row][best->col].vals[1] = '\0'; puzzle_t *return_puz; if ((return_puz = search(copy)) != NULL) { if (!solved(copy)) { //free_puzzle(copy); if ((puz != return_puz) && (puz != copy)) { free_puzzle(puz); } else if ((copy != puz) && (copy != return_puz)) { free_puzzle(copy); } } //free_puzzle(copy); return return_puz; } free_puzzle(copy); } return NULL; }
int solver() { int i, j, k, l, m, n, o, p, q; potential = malloc(9 * 362880 * 10 * sizeof(char)); new_places = malloc(9 * 9 * sizeof(char)); //print_possible_lines(); load_possible_lines(); copy_puzzle(); for(i = 0; i < num_of_solutions[0]; i++) { // one for each line print_time(); printf("i: %d\n", i); copy_line(0, &potential[i * 10 + (offset(0)*10)]); for(j = 0; j < num_of_solutions[1]; j++) { copy_line(1, &potential[j * 10 + (offset(1)*10)]); for(k = 0; k < num_of_solutions[2]; k++) { copy_line(2, &potential[k * 10 + (offset(2)*10)]); for(l = 0; l < num_of_solutions[3]; l++) { copy_line(3, &potential[l * 10 + (offset(3)*10)]); for(m = 0; m < num_of_solutions[4]; m++) { copy_line(4, &potential[m * 10 + (offset(4)*10)]); for(n = 0; n < num_of_solutions[5]; n++) { copy_line(5, &potential[n * 10 + (offset(5)*10)]); for(o = 0; o < num_of_solutions[6]; o++) { copy_line(6, &potential[o * 10 + (offset(6)*10)]); for(p = 0; p < num_of_solutions[7]; p++) { copy_line(7, &potential[p * 10 + (offset(7)*10)]); for(q = 0; q < num_of_solutions[8]; q++) { copy_line(8, &potential[q * 10 + (offset(8)*10)]); if(lines_valid() && columns_valid() && squares_valid()) { return(1); } } } } } } } } } } return(0); }