mirror of https://github.com/dnomd343/klotski.git
				
				
			
				 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