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