logik/solver.hpp

60 lines
1.4 KiB
C++

#pragma once
#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);
};
// Solving the game
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);
};