diff --git a/solver.cpp b/solver.cpp index 91c0f83..57b19d8 100644 --- a/solver.cpp +++ b/solver.cpp @@ -2,7 +2,7 @@ void Solver::generate_set(vector carry) { if(carry.size() == N) { - possible.push_back(carry); + possible.insert(carry); return; } @@ -21,17 +21,29 @@ vector Solver::guess() { return minimax({}).guess; } void Solver::learn(vector guess, Response response) { - vector> next_possible(0); + set> next_possible; for(auto sequence : possible) if(validate(sequence, guess) == response) - next_possible.push_back(sequence); + next_possible.insert(sequence); possible = next_possible; } // TODO int Solver::get_weight(vector guess) { - return 0; + // Indexing by N*somewhere + correct and holding how many sequences got that response + vector response_count(N*N+1, 0); + for(auto sequence : possible) { + Response response = validate(sequence, guess); + response_count[N*response.somewhere + response.correct]++; + } + + // Get highest possible number of sequences left + int max = 0; + for(int count : response_count) + if(count > max) + max = count; + return max - possible.count(guess); } Weighed_guess Solver::minimax(vector carry) { if(carry.size() == N) @@ -42,7 +54,7 @@ Weighed_guess Solver::minimax(vector carry) { carry.push_back(col); Weighed_guess next = minimax(carry); - if(next.weight > best.weight) + if(best.weight == -1 || next.weight < best.weight) best = next; carry.pop_back(); diff --git a/solver.hpp b/solver.hpp index e050eb9..951ef54 100644 --- a/solver.hpp +++ b/solver.hpp @@ -1,6 +1,9 @@ #pragma once +#include #include "global.hpp" +using std::set; + // For deciding the best guess struct Weighed_guess { int weight; @@ -12,7 +15,7 @@ struct Weighed_guess { // Solving the game class Solver { int N, M; - vector> possible = vector>(0); + set> possible; public: Solver(int N, int M);