From ef9ce4656eff39537f3ff2c4ffecb4e9c5c2dd8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9ophyl=20Hoguet?= Date: Thu, 10 Mar 2022 12:15:10 +0100 Subject: [PATCH] little opti --- .vscode/launch.json | 4 ++-- game_tools.c | 53 +++++---------------------------------------- 2 files changed, 7 insertions(+), 50 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 36ad3ae..c69b075 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -35,8 +35,8 @@ "program": "${workspaceFolder}/build/game_solve", "args": [ "-c", - "${workspaceFolder}/build/test.txt", - "${workspaceFolder}/build/testsol.txt" + "${workspaceFolder}/build/test3.txt", + "${workspaceFolder}/build/testsol3.txt" ], "stopAtEntry": false, diff --git a/game_tools.c b/game_tools.c index a4a8530..809ee3b 100644 --- a/game_tools.c +++ b/game_tools.c @@ -363,23 +363,10 @@ bool isAlreadyDone(uint i, uint j, uint* tab, uint size_tab) { * @return true if the game is solved * @return false if the game is unsolvable */ -bool aux_game_solve(game g, - uint deep, - int* move_played, - uint* alreadyDone, - uint size_alreadyDone, - uint max_size_alreadyDone, - bool nb_sol, - uint* cpt, - game** t_games, - uint* max_size) { +bool aux_game_solve(game g, uint deep, int* move_played, uint* alreadyDone, uint size_alreadyDone, uint max_size_alreadyDone, bool nb_sol, uint* cpt) { for (uint i = 0; i < game_nb_rows(g); i++) { for (uint j = 0; j < game_nb_cols(g); j++) { if (!isAlreadyDone(i, j, alreadyDone, size_alreadyDone)) { - if (nb_sol && (*cpt) + 1 == *max_size) { - (*max_size) = (*max_size) * 2; - (*t_games) = realloc((*t_games), sizeof(game) * (*max_size)); - } if (game_get_square(g, i, j) == S_BLANK) { alreadyDone[size_alreadyDone] = i; alreadyDone[size_alreadyDone + 1] = j; @@ -391,7 +378,6 @@ bool aux_game_solve(game g, if (!nb_sol) return true; else { - (*t_games)[*cpt] = game_copy(g); (*cpt)++; } } else { @@ -412,8 +398,7 @@ bool aux_game_solve(game g, for (uint index_alreadyDone = 0; index_alreadyDone < size_alreadyDone; index_alreadyDone++) { alreadyDoneNext[index_alreadyDone] = alreadyDone[index_alreadyDone]; } - if (aux_game_solve(g, deep - 1, move_played, alreadyDoneNext, size_alreadyDone, max_size_alreadyDone, nb_sol, cpt, t_games, - max_size)) { + if (aux_game_solve(g, deep - 1, move_played, alreadyDoneNext, size_alreadyDone, max_size_alreadyDone, nb_sol, cpt)) { return true; } } @@ -459,7 +444,7 @@ bool game_solve(game g) { for (uint deep = 1; deep < nb_blank_cases; deep++) { total_move_played += move_played; uint alreadyDone[nb_blank_cases * 2]; - if (aux_game_solve(g, deep, &move_played, alreadyDone, 0, nb_blank_cases * 2, false, NULL, NULL, NULL)) { + if (aux_game_solve(g, deep, &move_played, alreadyDone, 0, nb_blank_cases * 2, false, NULL)) { return true; } } @@ -469,33 +454,19 @@ bool game_solve(game g) { return false; } -void remove_all_mark(game g) { - for (uint i = 0; i < game_nb_rows(g); i++) { - for (uint j = 0; j < game_nb_cols(g); j++) { - if (game_is_marked(g, i, j)) { - game_set_square(g, i, j, S_BLANK); - } - } - } -} - uint game_nb_solutions(cgame g) { game copy_g = game_copy(g); - uint size = 4; - game* t_games = malloc(sizeof(game) * size); // first analyze of the game to reduce the number of brutforce needed int total_move_played = game_analyze(copy_g); // give move_played and not total_move_played to keep the first analyze int move_played = 0; uint nb_solutions = 0; if (total_move_played == -1) { - free(t_games); game_delete(copy_g); return 1; } // if the game is unsolvalbe at the first analyze it's unsolvable even with brutforce if (total_move_played == -2) { - free(t_games); game_delete(copy_g); return 0; } @@ -503,22 +474,8 @@ uint game_nb_solutions(cgame g) { // else try brutforce with deepness going from 1 to the total number of blank cases on the game for (uint deep = 1; deep < nb_blank_cases && nb_solutions == 0; deep++) { uint alreadyDone[nb_blank_cases * 2]; - aux_game_solve(copy_g, deep, &move_played, alreadyDone, 0, nb_blank_cases * 2, true, &nb_solutions, &t_games, &size); + aux_game_solve(copy_g, deep, &move_played, alreadyDone, 0, nb_blank_cases * 2, true, &nb_solutions); } - for (uint i = 0; i < nb_solutions; i++) { - remove_all_mark(t_games[i]); - } - uint res = nb_solutions; - for (uint i = 0; i < nb_solutions; i++) { - for (uint j = i + 1; j < nb_solutions; j++) { - if (game_equal(t_games[i], t_games[j])) { - res--; - break; - } - } - game_delete(t_games[i]); - } - free(t_games); game_delete(copy_g); - return res; + return nb_solutions; } \ No newline at end of file