mirror of https://github.com/dnomd343/klotski.git
Dnomd343
2 years ago
3 changed files with 5 additions and 165 deletions
@ -1,157 +0,0 @@ |
|||
#include "basic_ranges_demo.h" |
|||
|
|||
#include <algorithm> |
|||
|
|||
#include <iostream> |
|||
#include <vector> |
|||
#include <queue> |
|||
|
|||
#include "common.h" |
|||
|
|||
std::vector<uint32_t> unsort_data; |
|||
std::vector<uint32_t> release_data; |
|||
|
|||
void func_test(int n1, int n2, int n3, int n4) { |
|||
|
|||
struct inner_t { |
|||
/// n4 n3 n2 n1
|
|||
/// 00000000 00000000 00000000 00000000
|
|||
uint32_t n; |
|||
uint32_t prefix; |
|||
int offset; |
|||
}; |
|||
|
|||
constexpr uint32_t MASK_01 = (uint32_t)0b01 << 30; |
|||
constexpr uint32_t MASK_10 = (uint32_t)0b10 << 30; |
|||
constexpr uint32_t MASK_11 = (uint32_t)0b11 << 30; |
|||
|
|||
std::queue<inner_t> data; |
|||
|
|||
data.emplace(inner_t { |
|||
.n = static_cast<uint32_t>(n1 | n2 << 8 | n3 << 16 | n4 << 24), |
|||
.prefix = 0x00000000, |
|||
.offset = 0, |
|||
}); |
|||
|
|||
while (!data.empty()) { |
|||
if (!data.front().n) { |
|||
|
|||
/// range release
|
|||
// release_data.emplace_back(data.front().prefix);
|
|||
unsort_data.emplace_back(data.front().prefix); |
|||
|
|||
data.pop(); |
|||
continue; |
|||
} |
|||
|
|||
if (data.front().n & 0xFF) { |
|||
auto next = inner_t { |
|||
.n = data.front().n - 0x00000001, |
|||
.prefix = data.front().prefix, |
|||
.offset = data.front().offset + 2, |
|||
}; |
|||
data.emplace(next); |
|||
} |
|||
if (data.front().n & 0xFF00) { |
|||
auto next = inner_t { |
|||
.n = data.front().n - 0x00000100, |
|||
.prefix = data.front().prefix | (MASK_01 >> data.front().offset), |
|||
.offset = data.front().offset + 2, |
|||
}; |
|||
data.emplace(next); |
|||
} |
|||
if (data.front().n & 0xFF0000) { |
|||
auto next = inner_t { |
|||
.n = data.front().n - 0x00010000, |
|||
.prefix = data.front().prefix | (MASK_10 >> data.front().offset), |
|||
.offset = data.front().offset + 2, |
|||
}; |
|||
data.emplace(next); |
|||
} |
|||
if (data.front().n & 0xFF000000) { |
|||
auto next = inner_t { |
|||
.n = data.front().n - 0x01000000, |
|||
.prefix = data.front().prefix | (MASK_11 >> data.front().offset), |
|||
.offset = data.front().offset + 2, |
|||
}; |
|||
data.emplace(next); |
|||
} |
|||
data.pop(); |
|||
} |
|||
} |
|||
|
|||
void load_ranges() { |
|||
// std::cout << "ok" << std::endl;
|
|||
|
|||
unsort_data.reserve(7311921); |
|||
release_data.reserve(7311921); |
|||
|
|||
std::vector<int> start_point; |
|||
|
|||
for (int n = 0; n <= 7; ++n) { // number of 1x2 and 2x1 block -> 0 ~ 7
|
|||
for (int n_2x1 = 0; n_2x1 <= n; ++n_2x1) { // number of 2x1 block -> 0 ~ n
|
|||
for (int n_1x1 = 0; n_1x1 <= (14 - n * 2); ++n_1x1) { // number of 1x1 block -> 0 ~ (14 - 2n)
|
|||
int n_1x2 = n - n_2x1; |
|||
int n_space = 16 - n * 2 - n_1x1; |
|||
|
|||
start_point.emplace_back(unsort_data.size()); |
|||
|
|||
func_test(n_space, n_1x2, n_2x1, n_1x1); |
|||
|
|||
/// 0x0 -> 00 | 1x2 -> 01 | 2x1 -> 10 | 1x1 -> 11
|
|||
} |
|||
} |
|||
} |
|||
start_point.emplace_back(unsort_data.size()); |
|||
|
|||
/// self-build sort
|
|||
|
|||
struct node { |
|||
uint32_t value; |
|||
int index; |
|||
int limit; |
|||
}; |
|||
|
|||
struct compare { |
|||
bool operator() (node node1, node node2) { |
|||
return node1.value > node2.value; |
|||
} |
|||
}; |
|||
|
|||
std::priority_queue<node, std::vector<node>, compare> min_heap; |
|||
|
|||
for (int i = 0; i < start_point.size() - 1; ++i) { |
|||
min_heap.push({ |
|||
.value = unsort_data[start_point[i]], |
|||
.index = start_point[i], |
|||
.limit = start_point[i + 1] - 1, |
|||
}); |
|||
} |
|||
|
|||
while (!min_heap.empty()) { |
|||
auto current = min_heap.top(); |
|||
min_heap.pop(); |
|||
|
|||
release_data.emplace_back(current.value); |
|||
|
|||
if (current.index != current.limit) { |
|||
min_heap.push({ |
|||
.value = unsort_data[current.index + 1], |
|||
.index = current.index + 1, |
|||
.limit = current.limit, |
|||
}); |
|||
} |
|||
} |
|||
|
|||
|
|||
/// stl quick sort
|
|||
// sort(unsort_data.begin(), unsort_data.end());
|
|||
// release_data.insert(release_data.begin(), unsort_data.begin(), unsort_data.end());
|
|||
|
|||
std::cout << "size: " << release_data.size() << std::endl; |
|||
|
|||
// for (const auto &range: release_data) {
|
|||
// printf("%08X\n", Common::range_reverse(range));
|
|||
// }
|
|||
|
|||
} |
@ -1,3 +0,0 @@ |
|||
#pragma once |
|||
|
|||
void load_ranges(); |
Loading…
Reference in new issue