int in_results(pos scrpos) { if (term.results.length == 0) { return 0; } pos abspos = { .x = scrpos.x, .y = scrpos.y + term.sblines }; int match = in_results_recurse(abspos, 0, term.results.length); match += in_result(abspos, term.results.results[term.results.current]); return match; } void results_add(result abspos) { assert(term.results.capacity > 0); if (term.results.length == term.results.capacity) { term.results.capacity *= 2; term.results.results = renewn(term.results.results, term.results.capacity); } term.results.results[term.results.length] = abspos; ++term.results.length; }
bool start(successfull result[ITEMS], box current_matrix) { box new_matrix = {}; planch working_planch, temp_planch; for (int i = 0; i < ITEMS; i++) { if (in_result(i, result)) continue; for (int position = 0; position < 6; position++){ for (short level = 0; level < 2; level++) { for (short uturn = 0; uturn < 2; uturn++) { if (uturn) { turn_upside_down(items[i], working_planch); } else { memcpy(working_planch, items[i], ITEMS_SIZE); } for (short can_turn = 0; can_turn < 2; can_turn++) { if (can_turn) { turn(working_planch, temp_planch); memcpy(working_planch, temp_planch, ITEMS_SIZE); } ++INDEX; memcpy(new_matrix, current_matrix, MATRIX_SIZE); add_planch(position, working_planch, new_matrix, level); if (check_box(new_matrix)) { successfull temp_result[ITEMS]; memcpy(temp_result, result, RESULT_SIZE); temp_result[i].ready = true; temp_result[i].position = position; temp_result[i].item = i; temp_result[i].turn = can_turn; temp_result[i].turn_upside_down = uturn; if (check_result(temp_result)) { FOUND++; show_solution(temp_result, new_matrix, FOUND); return true; } start(temp_result, new_matrix); } } } } } } return false; }