77 lines
1.8 KiB
C++
77 lines
1.8 KiB
C++
|
|
#include "dynamic_grid.hpp"
|
|
#include "clusters.hpp"
|
|
#include "solver.hpp"
|
|
#include "generator.hpp"
|
|
#include "rules.hpp"
|
|
|
|
#include <boost/program_options.hpp>
|
|
|
|
#include <iostream>
|
|
#include <random>
|
|
#include <chrono>
|
|
#include <thread>
|
|
#include <algorithm>
|
|
|
|
int main(int argc, char** argv){
|
|
namespace po = boost::program_options;
|
|
|
|
int w = 5;
|
|
int h = 5;
|
|
int c = 3;
|
|
int explosion_size = 3;
|
|
|
|
// Describe program options
|
|
po::options_description opts;
|
|
opts.add_options()
|
|
("w", po::value(&w), "width of puzzles")
|
|
("h", po::value(&h), "height of puzzles")
|
|
("c", po::value(&c), "number of colors")
|
|
("explosion_size", po::value(&explosion_size), "minimum explosion size")
|
|
("help", po::bool_switch(), "show this help");
|
|
|
|
// Parse and store them in a vm
|
|
po::variables_map vm;
|
|
po::store(po::parse_command_line(argc, argv, opts), vm);
|
|
po::notify(vm);
|
|
|
|
if(vm["help"].as<bool>()){
|
|
std::cout << "Puzzle Wuzzle Generator, version " << __DATE__ << std::endl;
|
|
std::cout << opts << std::endl;
|
|
return 0;
|
|
}
|
|
|
|
#define OUT(x) std::cout << #x << " = " << x << "\n"
|
|
OUT(w); OUT(h); OUT(c); OUT(explosion_size);
|
|
#undef OUT
|
|
|
|
std::random_device rd;
|
|
std::mt19937 gen(rd());
|
|
|
|
BasicRules rules(explosion_size);
|
|
|
|
int count = 50000;
|
|
int solvable = 0;
|
|
int unsolvable = 0;
|
|
while(--count){
|
|
auto field = random_dynamic_grid(w, h, c, gen);
|
|
|
|
// std::cout << "\n= puzzle " << count << " =\n";
|
|
// field.print(std::cout);
|
|
|
|
auto solution = solve(field, rules);
|
|
if(!solution.solution_traces.empty()){
|
|
++solvable;
|
|
// std::cout << solution.solution_traces.size() << " solutions\n";
|
|
// for(auto&& t : solution.solution_traces[0]){
|
|
// std::cout << "(" << t.first << ", " << t.second << ")\n";
|
|
// }
|
|
} else {
|
|
++unsolvable;
|
|
// std::cout << "no solutions\n";
|
|
}
|
|
}
|
|
|
|
std::cout << solvable << " solvable\n";
|
|
std::cout << unsolvable << " unsolvable\n";
|
|
}
|