mirror of https://github.com/dnomd343/klotski.git
Dnomd343
2 months ago
8 changed files with 315 additions and 3 deletions
File diff suppressed because one or more lines are too long
@ -0,0 +1,38 @@ |
|||||
|
#include <algorithm> |
||||
|
|
||||
|
#include "group/group.h" |
||||
|
|
||||
|
using klotski::cases::GroupPro; |
||||
|
|
||||
|
using klotski::codec::CommonCode; |
||||
|
|
||||
|
using klotski::cases::RangesUnion; |
||||
|
|
||||
|
using klotski::cases::GROUP_PRO_SEED; |
||||
|
|
||||
|
RangesUnion GroupPro::cases() const { |
||||
|
auto seed = CommonCode::unsafe_create(GROUP_PRO_SEED[flat_id()]); |
||||
|
|
||||
|
// NOTE: convert as RawCode directly
|
||||
|
if (mirror_toward_ == 1) { |
||||
|
seed = seed.to_horizontal_mirror(); |
||||
|
} else if (mirror_toward_ == 2) { |
||||
|
seed = seed.to_vertical_mirror(); |
||||
|
} else if (mirror_toward_ == 3) { |
||||
|
// NOTE: avoid multi convert
|
||||
|
seed = seed.to_vertical_mirror().to_horizontal_mirror(); |
||||
|
} |
||||
|
|
||||
|
auto codes = Group::extend(seed.to_raw_code(), size()); |
||||
|
|
||||
|
RangesUnion data; |
||||
|
for (auto raw_code : codes) { |
||||
|
auto common_code = raw_code.to_common_code().unwrap(); |
||||
|
data[common_code >> 32].emplace_back(static_cast<uint32_t>(common_code)); |
||||
|
} |
||||
|
|
||||
|
for (int head = 0; head < 16; ++head) { |
||||
|
std::stable_sort(data[head].begin(), data[head].end()); |
||||
|
} |
||||
|
return data; |
||||
|
} |
@ -0,0 +1,111 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#include "constant/group_pro.h" |
||||
|
|
||||
|
namespace klotski::cases { |
||||
|
|
||||
|
constexpr uint32_t GroupPro::flat_id() const { |
||||
|
return PATTERN_OFFSET[type_id_] + pattern_id_; |
||||
|
} |
||||
|
|
||||
|
constexpr uint32_t GroupPro::size() const { |
||||
|
return GROUP_PRO_SIZE[flat_id()]; |
||||
|
} |
||||
|
|
||||
|
constexpr GroupPro::MirrorType GroupPro::mirror_type() const { |
||||
|
switch (GROUP_PRO_TYPE[flat_id()]) { |
||||
|
case 0: |
||||
|
return MirrorType::FullMirror; |
||||
|
case 1: |
||||
|
return MirrorType::HorizontalMirror; |
||||
|
case 2: |
||||
|
return MirrorType::CentroMirror; |
||||
|
case 3: |
||||
|
return MirrorType::VerticalMirror; |
||||
|
case 4: |
||||
|
return MirrorType::NonMirror; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
constexpr bool GroupPro::is_vertical_mirror() const { |
||||
|
switch (mirror_type()) { |
||||
|
case MirrorType::FullMirror: |
||||
|
return true; |
||||
|
case MirrorType::HorizontalMirror: |
||||
|
return false; |
||||
|
case MirrorType::CentroMirror: |
||||
|
return false; |
||||
|
case MirrorType::VerticalMirror: |
||||
|
return true; |
||||
|
case MirrorType::NonMirror: |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
constexpr bool GroupPro::is_horizontal_mirror() const { |
||||
|
switch (mirror_type()) { |
||||
|
case MirrorType::FullMirror: |
||||
|
return true; |
||||
|
case MirrorType::HorizontalMirror: |
||||
|
return true; |
||||
|
case MirrorType::CentroMirror: |
||||
|
return false; |
||||
|
case MirrorType::VerticalMirror: |
||||
|
return false; |
||||
|
case MirrorType::NonMirror: |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
constexpr GroupPro GroupPro::to_vertical_mirror() const { |
||||
|
switch (mirror_type()) { |
||||
|
case MirrorType::FullMirror: |
||||
|
return *this; |
||||
|
case MirrorType::HorizontalMirror: |
||||
|
if (mirror_toward_ == 0) { |
||||
|
return GroupPro::unsafe_create(type_id_, pattern_id_, 2); |
||||
|
} |
||||
|
return GroupPro::unsafe_create(type_id_, pattern_id_, 0); |
||||
|
case MirrorType::CentroMirror: |
||||
|
if (mirror_toward_ == 0) { |
||||
|
return GroupPro::unsafe_create(type_id_, pattern_id_, 1); |
||||
|
} |
||||
|
return GroupPro::unsafe_create(type_id_, pattern_id_, 0); |
||||
|
case MirrorType::VerticalMirror: |
||||
|
return *this; |
||||
|
case MirrorType::NonMirror: |
||||
|
if (mirror_toward_ == 0) { |
||||
|
return GroupPro::unsafe_create(type_id_, pattern_id_, 2); |
||||
|
} else if (mirror_toward_ == 1) { |
||||
|
return GroupPro::unsafe_create(type_id_, pattern_id_, 3); |
||||
|
} else if (mirror_toward_ == 2) { |
||||
|
return GroupPro::unsafe_create(type_id_, pattern_id_, 0); |
||||
|
} |
||||
|
return GroupPro::unsafe_create(type_id_, pattern_id_, 1); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
constexpr GroupPro GroupPro::to_horizontal_mirror() const { |
||||
|
switch (mirror_type()) { |
||||
|
case MirrorType::FullMirror: |
||||
|
case MirrorType::HorizontalMirror: |
||||
|
return *this; |
||||
|
case MirrorType::CentroMirror: |
||||
|
case MirrorType::VerticalMirror: |
||||
|
if (mirror_toward_ == 0) { |
||||
|
return GroupPro::unsafe_create(type_id_, pattern_id_, 1); |
||||
|
} |
||||
|
return GroupPro::unsafe_create(type_id_, pattern_id_, 0); |
||||
|
case MirrorType::NonMirror: |
||||
|
if (mirror_toward_ == 0) { |
||||
|
return GroupPro::unsafe_create(type_id_, pattern_id_, 2); |
||||
|
} else if (mirror_toward_ == 1) { |
||||
|
return GroupPro::unsafe_create(type_id_, pattern_id_, 3); |
||||
|
} else if (mirror_toward_ == 2) { |
||||
|
return GroupPro::unsafe_create(type_id_, pattern_id_, 0); |
||||
|
} |
||||
|
return GroupPro::unsafe_create(type_id_, pattern_id_, 1); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} // namespace klotski::cases |
Loading…
Reference in new issue