diff --git a/solver.cpp b/solver.cpp index f9520f5..f2b18a1 100644 --- a/solver.cpp +++ b/solver.cpp @@ -37,7 +37,7 @@ Weighed_guess Solver::minimax(vector> *possibilities, vector *c chosen->push_back(col); auto r2 = minimax(possibilities, chosen, index+1); - if(r2.weight > r.weight || r.weight == -2) + if((r2.weight > r.weight || r.weight == -2) && r2.weight > -1) r = r2; chosen->pop_back(); } @@ -59,7 +59,7 @@ void Solver::print() { // Clean guess and response from info we know Historic_guess Solver::clean(Historic_guess hist) { - vector already_used_in_cleaning(N, 0); + vector already_used_in_cleaning(N, false); // Clean empty colors for(int n = 0; n < N; n++) @@ -73,7 +73,7 @@ Historic_guess Solver::clean(Historic_guess hist) { if(known.final_color(n) == hist.guess[n]) { hist.guess[n] = -1; hist.response.correct -= 1; - already_used_in_cleaning[n] = 1; + already_used_in_cleaning[n] = true; } } @@ -87,7 +87,7 @@ Historic_guess Solver::clean(Historic_guess hist) { if(known.final_color(i) == hist.guess[n]) { hist.guess[n] = -1; hist.response.somewhere -= 1; - already_used_in_cleaning[i] = 1; + already_used_in_cleaning[i] = true; break; } } @@ -112,14 +112,26 @@ vector Solver::extract_info(Historic_guess hist) { if(guess[n] > -1 && known.can(n, guess[n])) possible_count++; - // None of these colors are there - if(hist.response.somewhere == 0 && hist.response.correct == 0) { - known.empty(hist.guess); + // The color isn't in the sequence, except for known info [0/0] + if(response.somewhere == 0 && response.correct == 0) { + + // Deduce what was cleaned + vector col_was_cleaned(M, false); + for(int n = 0; n < N; n++) + if(guess[n] != hist.guess[n]) + col_was_cleaned[hist.guess[n]] = true; + + for(int n = 0; n < N; n++) + if(guess[n] > -1 && col_was_cleaned[guess[n]]) + for(int n2 = 0; n2 < N; n2++) + if(known.final_color(n2) != guess[n]) + known.cannot_be(n2, guess[n]); + something_to_learn = false; learned_something = true; } - // None at the right spot + // None at the right spot [X/0] else if(response.correct == 0) { if(possible_count > 0) { known.not_here(guess); @@ -127,7 +139,7 @@ vector Solver::extract_info(Historic_guess hist) { } } - // At least only on the right spot + // At least only on the right spot [0/X] else if(response.somewhere == 0) { // Only colors that can be on these positions are left if(response.correct == possible_count) { @@ -135,14 +147,14 @@ vector Solver::extract_info(Historic_guess hist) { something_to_learn = false; learned_something = true; } - else if(hist.response.somewhere == 0){ + else if(hist.response.somewhere == 0) { if(known.if_not_here_then_nowhere(hist.guess)) { learned_something = true; } } } - // Nonzero / nonzero + // The rest [X/X] else { // Only colors that can be on these positions are left if(response.correct == possible_count) { @@ -158,9 +170,6 @@ void Solver::learn(vector guess, Response response) { if(response.somewhere + response.correct == N) known.all_are_here(guess); - if(guess[0] == -1) - return; - // Write to history history.push_back({guess, response});