Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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);
}