mirror of https://github.com/dnomd343/klotski.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
1.4 KiB
66 lines
1.4 KiB
#include "core.h"
|
|
#include "common.h"
|
|
#include "fast_cal.h"
|
|
|
|
#include "raw_code.h"
|
|
|
|
#include <iostream>
|
|
|
|
void FastCal::fast_cal(uint64_t code) {
|
|
|
|
std::cout << RawCode(code).dump_case() << std::endl;
|
|
|
|
auto core = Core(
|
|
std::bind(&FastCal::add_new_case, this, std::placeholders::_1, std::placeholders::_2)
|
|
);
|
|
|
|
cases.empty();
|
|
cache.empty();
|
|
|
|
cases[code] = fast_cal_t {
|
|
.code = code,
|
|
.mask = 0,
|
|
.last = nullptr,
|
|
};
|
|
cache.emplace(&cases[code]);
|
|
|
|
while (!cache.empty()) {
|
|
|
|
// break check point
|
|
if (((cache.front()->code >> (3 * 0xD)) & 0b111) == B_2x2) {
|
|
std::cout << "Resolved" << std::endl;
|
|
// std::cout << RawCode(cache.front()->code).dump_case() << std::endl;
|
|
break;
|
|
}
|
|
|
|
core.next_step(cache.front()->code, cache.front()->mask);
|
|
cache.pop();
|
|
}
|
|
|
|
auto solution = cache.front();
|
|
|
|
while (solution != nullptr) {
|
|
// std::cout << RawCode(solution->code).dump_case() << std::endl;
|
|
solution = solution->last;
|
|
}
|
|
|
|
}
|
|
|
|
void FastCal::add_new_case(uint64_t code, uint64_t mask) {
|
|
|
|
auto exist_case = cases.find(code);
|
|
if (exist_case != cases.end()) { // find existed case
|
|
|
|
exist_case->second.mask |= mask; // mask update
|
|
return;
|
|
|
|
}
|
|
|
|
cases[code] = fast_cal_t {
|
|
.code = code,
|
|
.mask = mask,
|
|
.last = cache.front(),
|
|
};;
|
|
cache.emplace(&cases[code]);
|
|
|
|
}
|
|
|