59 lines
1.4 KiB
C++
59 lines
1.4 KiB
C++
#include "global.hpp"
|
|
#include <algorithm>
|
|
#include <chrono>
|
|
#include <random>
|
|
|
|
|
|
struct Game {
|
|
private:
|
|
vector<vector<bool>> possible;
|
|
std::default_random_engine random_engine;
|
|
public:
|
|
int N, M;
|
|
Game(int p_N, int p_M);
|
|
|
|
// Get known information
|
|
bool can(int n, int col);
|
|
int final_color(int n);
|
|
void print();
|
|
vector<vector<int>> list_all_possibilities();
|
|
vector<vector<int>> get_positions_of_colors(vector<int> guess);
|
|
|
|
// Utility functions
|
|
void cannot_be(int n, int col);
|
|
void must_be(int n, int must_col);
|
|
void empty_color(int col);
|
|
|
|
// Learning functions
|
|
void if_not_here_then_nowhere(vector<int> guess);
|
|
void here(vector<int> guess);
|
|
void not_here(vector<int> guess);
|
|
void empty(vector<int> guess);
|
|
void all_are_here(vector<int> guess);
|
|
|
|
};
|
|
|
|
// For remembering guesses with their responses
|
|
struct Historic_guess {
|
|
vector<int> guess, response;
|
|
Historic_guess(vector<int> p_guess, vector<int> p_response);
|
|
};
|
|
|
|
class Solver {
|
|
Game known;
|
|
int N, M;
|
|
vector<Historic_guess> history = {};
|
|
public:
|
|
Solver(int N, int M);
|
|
|
|
vector<int> guess();
|
|
void print();
|
|
void learn(vector<int> guess, vector<int> response);
|
|
|
|
private:
|
|
Historic_guess clean(Historic_guess hist);
|
|
bool extract_info(Historic_guess hist);
|
|
|
|
bool all_are_consistent(vector<int> supposed_sequence);
|
|
vector<int> brute_force(vector<vector<int>> *possibilities, vector<int> *chosen, int index);
|
|
};
|