From 98ec2f3a1b109105287444fa9212fe7f50343441 Mon Sep 17 00:00:00 2001 From: Dnomd343 Date: Sat, 1 Jun 2024 20:55:49 +0800 Subject: [PATCH] feat: constants for GroupUnion --- .../group/internal/constant/group_union.h | 168 ++++++++++++++++++ src/core/group/internal/group_union.cc | 143 +++++++++------ src/core/group/internal/group_union.inl | 61 +------ src/core/main.cc | 8 +- src/core/ranges/ranges.h | 15 +- 5 files changed, 274 insertions(+), 121 deletions(-) create mode 100644 src/core/group/internal/constant/group_union.h diff --git a/src/core/group/internal/constant/group_union.h b/src/core/group/internal/constant/group_union.h new file mode 100644 index 0000000..f1fc84c --- /dev/null +++ b/src/core/group/internal/constant/group_union.h @@ -0,0 +1,168 @@ +#pragma once + +#include + +namespace klotski::cases { + +/// The number of groups contained in GroupUnion. +constexpr auto GROUP_NUM = std::to_array({ + 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , + 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 13 , 1 , 1 , 1 , 1 , + 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 5 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , + 1 , 1 , 3 , 79 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 21 , 141, 1 , + 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 17 , 1 , 1 , 1 , 1 , 1 , 1 , + 1 , 17 , 273 , 1 , 1 , 1 , 1 , 1 , 1 , 9 , 145 , 841 , 1 , 1 , 1 , 1 , + 1 , 1 , 15 , 97 , 517 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 5 , 91 , 1 , 1 , + 1 , 1 , 1 , 59 , 587 , 1 , 1 , 1 , 1 , 21 , 353 , 1741, 1 , 1 , 1 , 7 , + 81 , 479, 2327, 1 , 1 , 1 , 5 , 33 , 165, 1053, 1 , 1 , 1 , 1 , 1 , 9 , + 157, 1 , 1 , 1 , 57 , 505, 1 , 1 , 13 , 325 , 1729, 3 , 9 , 99 , 631, 2609, + 1 , 17 , 91 , 487, 2653, 1 , 1 , 11 , 75 , 898 , 2 , 2 , 2 , 2 , 80 , 1 , + 2 , 138, 14 , 126, 590 , 22 , 183, 1074, 33 , 209 , 1178, 13 , 171, 1185, 6 , 16 , + 214, 6 , 18 , 54 , 2 , 44 , 40 , 124 , 84 , 70 , 18 , +}); + +/// The maximum Group size in each GroupUnion. +constexpr auto MAX_GROUP_SIZE = std::to_array({ + 12 , 192 , 1440 , 6720 , 21840 , 52416 , 96096 , 137280, 154440, 137280, 96096 , 52416 , + 21840 , 6720 , 1440 , 124 , 1736 , 11284 , 45136 , 124124, 248248, 372372, 425568, 372372, + 248248, 124124, 45136 , 10836 , 132 , 1848 , 12012 , 48048 , 132132, 264264, 396396, 453024, + 396396, 264264, 132132, 48048 , 11916 , 512 , 6144 , 33792 , 112640, 253440, 405504, 473088, + 405504, 253440, 112576, 30104 , 1044 , 12528 , 68904 , 229680, 516780, 826848, 964656, 826848, + 516780, 228848, 65848 , 582 , 6984 , 38412 , 128040, 288090, 460944, 537768, 460944, 288090, + 128040, 37740 , 1092 , 10920 , 49140 , 131040, 229320, 275184, 229320, 130032, 38672 , 3180 , + 31800 , 143100, 381600, 667800, 801360, 667544, 377408, 127676, 3382 , 33820 , 152190, 405840, + 710220, 852264, 709388, 403056, 143462, 1320 , 13200 , 59400 , 158400, 277200, 332640, 277200, + 158272, 57524 , 1320 , 10560 , 36960 , 73920 , 92400 , 71944 , 23704 , 4680 , 37440 , 131040, + 262080, 327120, 253968, 105064, 7248 , 57984 , 202944, 405440, 504616, 396284, 175580, 5344 , + 42752 , 149632, 299136, 373184, 296520, 136040, 1632 , 13056 , 45696 , 91392 , 114240, 91264 , + 43704 , 948 , 5688 , 14220 , 17696 , 7888 , 3444 , 20664 , 51044 , 61204 , 28832 , 7048 , + 42288 , 104540, 132556, 81462 , 7284 , 42728 , 104960, 135192, 81340 , 4392 , 26352 , 65688 , + 86968 , 25955 , 522 , 3132 , 7830 , 10440 , 7462 , 396 , 792 , 508 , 240 , 768 , + 742 , 1804 , 2348 , 1398 , 1504 , 5372 , 1192 , 2984 , 4376 , 453 , 350 , 1380 , + 1532 , 45 , 66 , 38 , 44 , 5 , 82 , 21 , 23 , 24 , 21 , +}); + +/// The number of cases contained in GroupUnion. +constexpr auto GROUP_UNION_SIZE = std::to_array({ + 12 , 192 , 1440 , 6720 , 21840 , 52416 , 96096 , 137280, 154440, 137280, 96096 , 52416 , + 21840 , 6720 , 1440 , 124 , 1736 , 11284 , 45136 , 124124, 248248, 372372, 425568, 372372, + 248248, 124124, 45136 , 11284 , 132 , 1848 , 12012 , 48048 , 132132, 264264, 396396, 453024, + 396396, 264264, 132132, 48048 , 12012 , 512 , 6144 , 33792 , 112640, 253440, 405504, 473088, + 405504, 253440, 112640, 33792 , 1044 , 12528 , 68904 , 229680, 516780, 826848, 964656, 826848, + 516780, 229680, 68904 , 582 , 6984 , 38412 , 128040, 288090, 460944, 537768, 460944, 288090, + 128040, 38412 , 1092 , 10920 , 49140 , 131040, 229320, 275184, 229320, 131040, 49140 , 3180 , + 31800 , 143100, 381600, 667800, 801360, 667800, 381600, 143100, 3382 , 33820 , 152190, 405840, + 710220, 852264, 710220, 405840, 152190, 1320 , 13200 , 59400 , 158400, 277200, 332640, 277200, + 158400, 59400 , 1320 , 10560 , 36960 , 73920 , 92400 , 73920 , 36960 , 4680 , 37440 , 131040, + 262080, 327600, 262080, 131040, 7248 , 57984 , 202944, 405888, 507360, 405888, 202944, 5344 , + 42752 , 149632, 299264, 374080, 299264, 149632, 1632 , 13056 , 45696 , 91392 , 114240, 91392 , + 45696 , 948 , 5688 , 14220 , 18960 , 14220 , 3444 , 20664 , 51660 , 68880 , 51660 , 7120 , + 42720 , 106800, 142400, 106800, 7284 , 43704 , 109260, 145680, 109260, 4392 , 26352 , 65880 , + 87840 , 65880 , 1044 , 6264 , 15660 , 20880 , 15660 , 396 , 1584 , 2376 , 1260 , 5040 , + 7560 , 3084 , 12336 , 18504 , 4288 , 17152 , 25728 , 3196 , 12784 , 19176 , 1836 , 7344 , + 11016 , 270 , 1080 , 1620 , 88 , 180 , 626 , 772 , 1036 , 464 , 342 , +}); + +/// The number of (1x2 + 2x1) / 2x1 / 1x1 blocks corresponding to different type_id. +constexpr auto BLOCK_NUM = std::to_array>({ + {0, 0, 0 }, {0, 0, 1 }, {0, 0, 2 }, {0, 0, 3 }, {0, 0, 4 }, {0, 0, 5 }, {0, 0, 6 }, {0, 0, 7 }, + {0, 0, 8 }, {0, 0, 9 }, {0, 0, 10}, {0, 0, 11}, {0, 0, 12}, {0, 0, 13}, {0, 0, 14}, {1, 0, 0 }, + {1, 0, 1 }, {1, 0, 2 }, {1, 0, 3 }, {1, 0, 4 }, {1, 0, 5 }, {1, 0, 6 }, {1, 0, 7 }, {1, 1, 0 }, + {1, 0, 8 }, {1, 1, 8 }, {1, 0, 9 }, {1, 1, 1 }, {1, 1, 9 }, {1, 0, 10}, {1, 1, 10}, {1, 1, 2 }, + {1, 1, 11}, {1, 1, 3 }, {1, 0, 11}, {1, 1, 12}, {1, 0, 12}, {1, 1, 4 }, {1, 1, 5 }, {1, 1, 6 }, + {1, 1, 7 }, {2, 0, 0 }, {2, 0, 1 }, {2, 0, 2 }, {2, 0, 3 }, {2, 0, 4 }, {2, 0, 5 }, {2, 0, 6 }, + {2, 0, 7 }, {2, 0, 8 }, {2, 1, 8 }, {2, 1, 0 }, {2, 0, 9 }, {2, 1, 1 }, {2, 1, 9 }, {2, 1, 2 }, + {2, 1, 10}, {2, 0, 10}, {2, 1, 3 }, {2, 1, 4 }, {2, 1, 5 }, {2, 1, 6 }, {2, 1, 7 }, {2, 2, 0 }, + {2, 2, 1 }, {2, 2, 2 }, {2, 2, 3 }, {2, 2, 4 }, {2, 2, 5 }, {2, 2, 6 }, {2, 2, 7 }, {2, 2, 8 }, + {2, 2, 9 }, {2, 2, 10}, {3, 0, 0 }, {3, 0, 1 }, {3, 0, 2 }, {3, 0, 3 }, {3, 0, 4 }, {3, 0, 5 }, + {3, 0, 6 }, {3, 0, 7 }, {3, 1, 8 }, {3, 0, 8 }, {3, 1, 0 }, {3, 1, 1 }, {3, 1, 2 }, {3, 1, 3 }, + {3, 1, 4 }, {3, 1, 5 }, {3, 1, 6 }, {3, 1, 7 }, {3, 2, 0 }, {3, 2, 1 }, {3, 2, 2 }, {3, 2, 3 }, + {3, 2, 4 }, {3, 2, 5 }, {3, 2, 6 }, {3, 2, 7 }, {3, 3, 0 }, {3, 3, 8 }, {3, 2, 8 }, {3, 3, 1 }, + {3, 3, 2 }, {3, 3, 3 }, {3, 3, 4 }, {3, 3, 5 }, {3, 3, 6 }, {3, 3, 7 }, {4, 0, 0 }, {4, 0, 1 }, + {4, 0, 2 }, {4, 0, 3 }, {4, 0, 4 }, {4, 0, 5 }, {4, 0, 6 }, {4, 1, 0 }, {4, 1, 1 }, {4, 1, 2 }, + {4, 1, 3 }, {4, 1, 4 }, {4, 1, 5 }, {4, 1, 6 }, {4, 2, 0 }, {4, 2, 1 }, {4, 2, 2 }, {4, 2, 3 }, + {4, 2, 4 }, {4, 2, 5 }, {4, 2, 6 }, {4, 3, 0 }, {4, 3, 1 }, {4, 3, 2 }, {4, 3, 3 }, {4, 3, 4 }, + {4, 3, 5 }, {4, 3, 6 }, {4, 4, 0 }, {4, 4, 1 }, {4, 4, 2 }, {4, 4, 3 }, {4, 4, 4 }, {4, 4, 5 }, + {4, 4, 6 }, {5, 0, 0 }, {5, 0, 1 }, {5, 0, 2 }, {5, 0, 3 }, {5, 0, 4 }, {5, 1, 0 }, {5, 1, 1 }, + {5, 1, 2 }, {5, 1, 3 }, {5, 1, 4 }, {5, 2, 0 }, {5, 2, 1 }, {5, 2, 2 }, {5, 2, 3 }, {5, 2, 4 }, + {5, 3, 0 }, {5, 3, 1 }, {5, 3, 2 }, {5, 3, 3 }, {5, 3, 4 }, {5, 4, 0 }, {5, 4, 1 }, {5, 4, 2 }, + {5, 4, 3 }, {5, 4, 4 }, {5, 5, 0 }, {5, 5, 1 }, {5, 5, 2 }, {5, 5, 3 }, {5, 5, 4 }, {6, 0, 0 }, + {6, 0, 1 }, {6, 0, 2 }, {6, 1, 0 }, {6, 1, 1 }, {6, 1, 2 }, {6, 2, 0 }, {6, 2, 1 }, {6, 2, 2 }, + {6, 3, 0 }, {6, 3, 1 }, {6, 3, 2 }, {6, 4, 0 }, {6, 4, 1 }, {6, 4, 2 }, {6, 5, 0 }, {6, 5, 1 }, + {6, 5, 2 }, {6, 6, 0 }, {6, 6, 1 }, {6, 6, 2 }, {7, 0, 0 }, {7, 1, 0 }, {7, 2, 0 }, {7, 3, 0 }, + {7, 4, 0 }, {7, 5, 0 }, {7, 6, 0 }, +}); + +/// The number of cases with different heads in GroupUnion. +constexpr auto GROUP_UNION_CASES_NUM = std::to_array>({ + {1 , 1 , 1 , 1 }, {16 , 16 , 16 , 16 }, {120 , 120 , 120 , 120 }, + {560 , 560 , 560 , 560 }, {1820 , 1820 , 1820 , 1820 }, {4368 , 4368 , 4368 , 4368 }, + {8008 , 8008 , 8008 , 8008 }, {11440, 11440, 11440, 11440}, {12870, 12870, 12870, 12870}, + {11440, 11440, 11440, 11440}, {8008 , 8008 , 8008 , 8008 }, {4368 , 4368 , 4368 , 4368 }, + {1820 , 1820 , 1820 , 1820 }, {560 , 560 , 560 , 560 }, {120 , 120 , 120 , 120 }, + {11 , 9 , 11 , 9 }, {154 , 126 , 154 , 126 }, {1001 , 819 , 1001 , 819 }, + {4004 , 3276 , 4004 , 3276 }, {11011, 9009 , 11011, 9009 }, {22022, 18018, 22022, 18018}, + {33033, 27027, 33033, 27027}, {37752, 30888, 37752, 30888}, {12 , 12 , 10 , 10 }, + {33033, 27027, 33033, 27027}, {36036, 36036, 30030, 30030}, {22022, 18018, 22022, 18018}, + {168 , 168 , 140 , 140 }, {24024, 24024, 20020, 20020}, {11011, 9009 , 11011, 9009 }, + {12012, 12012, 10010, 10010}, {1092 , 1092 , 910 , 910 }, {4368 , 4368 , 3640 , 3640 }, + {4368 , 4368 , 3640 , 3640 }, {4004 , 3276 , 4004 , 3276 }, {1092 , 1092 , 910 , 910 }, + {1001 , 819 , 1001 , 819 }, {12012, 12012, 10010, 10010}, {24024, 24024, 20020, 20020}, + {36036, 36036, 30030, 30030}, {41184, 41184, 34320, 34320}, {49 , 30 , 49 , 30 }, + {588 , 360 , 588 , 360 }, {3234 , 1980 , 3234 , 1980 }, {10780, 6600 , 10780, 6600 }, + {24255, 14850, 24255, 14850}, {38808, 23760, 38808, 23760}, {45276, 27720, 45276, 27720}, + {38808, 23760, 38808, 23760}, {24255, 14850, 24255, 14850}, {49005, 40590, 41580, 36630}, + {99 , 82 , 84 , 74 }, {10780, 6600 , 10780, 6600 }, {1188 , 984 , 1008 , 888 }, + {21780, 18040, 18480, 16280}, {6534 , 5412 , 5544 , 4884 }, {6534 , 5412 , 5544 , 4884 }, + {3234 , 1980 , 3234 , 1980 }, {21780, 18040, 18480, 16280}, {49005, 40590, 41580, 36630}, + {78408, 64944, 66528, 58608}, {91476, 75768, 77616, 68376}, {78408, 64944, 66528, 58608}, + {58 , 58 , 39 , 39 }, {696 , 696 , 468 , 468 }, {3828 , 3828 , 2574 , 2574 }, + {12760, 12760, 8580 , 8580 }, {28710, 28710, 19305, 19305}, {45936, 45936, 30888, 30888}, + {53592, 53592, 36036, 36036}, {45936, 45936, 30888, 30888}, {28710, 28710, 19305, 19305}, + {12760, 12760, 8580 , 8580 }, {3828 , 3828 , 2574 , 2574 }, {114 , 45 , 114 , 45 }, + {1140 , 450 , 1140 , 450 }, {5130 , 2025 , 5130 , 2025 }, {13680, 5400 , 13680, 5400 }, + {23940, 9450 , 23940, 9450 }, {28728, 11340, 28728, 11340}, {23940, 9450 , 23940, 9450 }, + {13680, 5400 , 13680, 5400 }, {14355, 9270 , 12240, 9090 }, {5130 , 2025 , 5130 , 2025 }, + {319 , 206 , 272 , 202 }, {3190 , 2060 , 2720 , 2020 }, {14355, 9270 , 12240, 9090 }, + {38280, 24720, 32640, 24240}, {66990, 43260, 57120, 42420}, {80388, 51912, 68544, 50904}, + {66990, 43260, 57120, 42420}, {38280, 24720, 32640, 24240}, {346 , 288 , 243 , 225 }, + {3460 , 2880 , 2430 , 2250 }, {15570, 12960, 10935, 10125}, {41520, 34560, 29160, 27000}, + {72660, 60480, 51030, 47250}, {87192, 72576, 61236, 56700}, {72660, 60480, 51030, 47250}, + {41520, 34560, 29160, 27000}, {144 , 144 , 76 , 76 }, {6480 , 6480 , 3420 , 3420 }, + {15570, 12960, 10935, 10125}, {1440 , 1440 , 760 , 760 }, {6480 , 6480 , 3420 , 3420 }, + {17280, 17280, 9120 , 9120 }, {30240, 30240, 15960, 15960}, {36288, 36288, 19152, 19152}, + {30240, 30240, 15960, 15960}, {17280, 17280, 9120 , 9120 }, {150 , 30 , 150 , 30 }, + {1200 , 240 , 1200 , 240 }, {4200 , 840 , 4200 , 840 }, {8400 , 1680 , 8400 , 1680 }, + {10500, 2100 , 10500, 2100 }, {8400 , 1680 , 8400 , 1680 }, {4200 , 840 , 4200 , 840 }, + {507 , 230 , 426 , 244 }, {4056 , 1840 , 3408 , 1952 }, {14196, 6440 , 11928, 6832 }, + {28392, 12880, 23856, 13664}, {35490, 16100, 29820, 17080}, {28392, 12880, 23856, 13664}, + {14196, 6440 , 11928, 6832 }, {767 , 509 , 557 , 467 }, {6136 , 4072 , 4456 , 3736 }, + {21476, 14252, 15596, 13076}, {42952, 28504, 31192, 26152}, {53690, 35630, 38990, 32690}, + {42952, 28504, 31192, 26152}, {21476, 14252, 15596, 13076}, {593 , 498 , 334 , 320 }, + {4744 , 3984 , 2672 , 2560 }, {16604, 13944, 9352 , 8960 }, {33208, 27888, 18704, 17920}, + {41510, 34860, 23380, 22400}, {33208, 27888, 18704, 17920}, {16604, 13944, 9352 , 8960 }, + {193 , 193 , 79 , 79 }, {1544 , 1544 , 632 , 632 }, {5404 , 5404 , 2212 , 2212 }, + {10808, 10808, 4424 , 4424 }, {13510, 13510, 5530 , 5530 }, {10808, 10808, 4424 , 4424 }, + {5404 , 5404 , 2212 , 2212 }, {114 , 9 , 114 , 9 }, {684 , 54 , 684 , 54 }, + {1710 , 135 , 1710 , 135 }, {2280 , 180 , 2280 , 180 }, {1710 , 135 , 1710 , 135 }, + {413 , 106 , 334 , 122 }, {2478 , 636 , 2004 , 732 }, {6195 , 1590 , 5010 , 1830 }, + {8260 , 2120 , 6680 , 2440 }, {6195 , 1590 , 5010 , 1830 }, {788 , 402 , 579 , 424 }, + {4728 , 2412 , 3474 , 2544 }, {11820, 6030 , 8685 , 6360 }, {15760, 8040 , 11580, 8480 }, + {11820, 6030 , 8685 , 6360 }, {829 , 550 , 498 , 438 }, {4974 , 3300 , 2988 , 2628 }, + {12435, 8250 , 7470 , 6570 }, {16580, 11000, 9960 , 8760 }, {12435, 8250 , 7470 , 6570 }, + {521 , 453 , 235 , 231 }, {3126 , 2718 , 1410 , 1386 }, {7815 , 6795 , 3525 , 3465 }, + {10420, 9060 , 4700 , 4620 }, {7815 , 6795 , 3525 , 3465 }, {132 , 132 , 42 , 42 }, + {792 , 792 , 252 , 252 }, {1980 , 1980 , 630 , 630 }, {2640 , 2640 , 840 , 840 }, + {1980 , 1980 , 630 , 630 }, {49 , 1 , 49 , 1 }, {196 , 4 , 196 , 4 }, + {294 , 6 , 294 , 6 }, {165 , 22 , 126 , 26 }, {660 , 88 , 504 , 104 }, + {990 , 132 , 756 , 156 }, {374 , 115 , 269 , 141 }, {1496 , 460 , 1076 , 564 }, + {2244 , 690 , 1614 , 846 }, {491 , 282 , 310 , 260 }, {1964 , 1128 , 1240 , 1040 }, + {2946 , 1692 , 1860 , 1560 }, {394 , 254 , 197 , 162 }, {1576 , 1016 , 788 , 648 }, + {2364 , 1524 , 1182 , 972 }, {224 , 212 , 86 , 86 }, {896 , 848 , 344 , 344 }, + {1344 , 1272 , 516 , 516 }, {36 , 36 , 9 , 9 }, {144 , 144 , 36 , 36 }, + {216 , 216 , 54 , 54 }, {11 , 0 , 11 , 0 }, {25 , 2 , 18 , 2 }, + {83 , 14 , 57 , 19 }, {94 , 38 , 61 , 38 }, {126 , 73 , 69 , 55 }, + {60 , 40 , 28 , 16 }, {42 , 42 , 15 , 15 }, +}); + +} // namespace klotski::cases diff --git a/src/core/group/internal/group_union.cc b/src/core/group/internal/group_union.cc index 175be38..e0cbc7f 100644 --- a/src/core/group/internal/group_union.cc +++ b/src/core/group/internal/group_union.cc @@ -9,6 +9,8 @@ #include #include +#include "constant/group_union.h" + static KLSK_INLINE uint32_t type_id(const int n, const int n_2x1, const int n_1x1) { constexpr int offset[8] = {0, 15, 41, 74, 110, 145, 175, 196}; return offset[n] + (15 - n * 2) * n_2x1 + n_1x1; @@ -36,61 +38,14 @@ uint32_t klotski::cases::GroupUnion::type_id(codec::RawCode raw_code) { return raw_code_to_type_id(raw_code.unwrap()); } -// TODO: using {n, n_2x1, n_1x1} for CPU cache-line perf. - -constexpr int TYPE_ID_N_NUM[203] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, -}; - -constexpr int TYPE_ID_N_2x1_NUM[203] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, - 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, - 2, 2, 2, 2, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 0, 0, - 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, - 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, - 4, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, - 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 0, - 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, - 5, 6, 6, 6, 0, 1, 2, 3, 4, 5, 6, -}; - -constexpr int TYPE_ID_N_1x1_NUM[203] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0, - 1, 2, 3, 4, 5, 6, 7, 0, 8, 8, 9, 1, 9, 10, 10, 2, - 11, 3, 11, 12, 12, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, - 7, 8, 8, 0, 9, 1, 9, 2, 10, 10, 3, 4, 5, 6, 7, 0, - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 1, 2, 3, 4, 5, - 6, 7, 8, 8, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, - 4, 5, 6, 7, 0, 8, 8, 1, 2, 3, 4, 5, 6, 7, 0, 1, - 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, - 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, - 6, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, - 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, - 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, - 2, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, -}; - klotski::cases::RangesUnion klotski::cases::GroupUnion::cases() const { Ranges ranges {}; - int n = TYPE_ID_N_NUM[type_id_]; - int n_2x1 = TYPE_ID_N_2x1_NUM[type_id_]; - int n_1x1 = TYPE_ID_N_1x1_NUM[type_id_]; // TODO: cal from type_id + + auto [n, n_2x1, n_1x1] = BLOCK_NUM[type_id_]; + + // int n = TYPE_ID_N_NUM[type_id_]; + // int n_2x1 = TYPE_ID_N_2x1_NUM[type_id_]; + // int n_1x1 = TYPE_ID_N_1x1_NUM[type_id_]; // TODO: cal from type_id ranges.spawn(n, n_2x1, n_1x1); // for (int i = 0; i < TYPE_ID_LIMIT; ++i) { @@ -98,11 +53,54 @@ klotski::cases::RangesUnion klotski::cases::GroupUnion::cases() const { // } // std::stable_sort(ranges.begin(), ranges.end()); - for (auto &x : ranges) { - x = klotski::range_reverse(x); - } + // for (auto &x : ranges) { + // x = klotski::range_reverse(x); + // } + + ranges.reverse(); + + // auto do_assert = [](uint32_t lhs, uint32_t rhs) { + // if (lhs != rhs) { + // std::cout << "error" << std::endl; + // } + // }; RangesUnion cases; + + // cases[0x0].reserve(7815); + // cases[0x1].reserve(6795); + // cases[0x2].reserve(7815); + // + // cases[0x4].reserve(3525); + // cases[0x5].reserve(3465); + // cases[0x6].reserve(3525); + // + // cases[0x8].reserve(3525); + // cases[0x9].reserve(3465); + // cases[0xA].reserve(3525); + // + // cases[0xC].reserve(7815); + // cases[0xD].reserve(6795); + // cases[0xE].reserve(7815); + + auto [A, B, C, D] = GROUP_UNION_CASES_NUM[type_id_]; + + cases[0x0].reserve(A); + cases[0x1].reserve(B); + cases[0x2].reserve(A); + + cases[0x4].reserve(C); + cases[0x5].reserve(D); + cases[0x6].reserve(C); + + cases[0x8].reserve(C); + cases[0x9].reserve(D); + cases[0xA].reserve(C); + + cases[0xC].reserve(A); + cases[0xD].reserve(B); + cases[0xE].reserve(A); + ranges.derive(0x0, cases[0x0]); ranges.derive(0x1, cases[0x1]); ranges.derive(0x2, cases[0x2]); @@ -119,5 +117,38 @@ klotski::cases::RangesUnion klotski::cases::GroupUnion::cases() const { ranges.derive(0xD, cases[0xD]); ranges.derive(0xE, cases[0xE]); + // uint32_t A = cases[0x0].size(); + // uint32_t B = cases[0x1].size(); + // uint32_t C = cases[0x4].size(); + // uint32_t D = cases[0x5].size(); + // + // do_assert(cases[0x2].size(), A); + // do_assert(cases[0x6].size(), C); + // do_assert(cases[0x8].size(), C); + // do_assert(cases[0x9].size(), D); + // do_assert(cases[0xA].size(), C); + // do_assert(cases[0xC].size(), A); + // do_assert(cases[0xD].size(), B); + // do_assert(cases[0xE].size(), A); + // + // std::cout << A << ", " << B << ", " << C << ", " << D << std::endl; + + // auto [A, B, C, D] = kk[type_id_]; + // do_assert(cases[0x0].size(), A); + // do_assert(cases[0x1].size(), B); + // do_assert(cases[0x2].size(), A); + // + // do_assert(cases[0x4].size(), C); + // do_assert(cases[0x5].size(), D); + // do_assert(cases[0x6].size(), C); + // + // do_assert(cases[0x8].size(), C); + // do_assert(cases[0x9].size(), D); + // do_assert(cases[0xA].size(), C); + // + // do_assert(cases[0xC].size(), A); + // do_assert(cases[0xD].size(), B); + // do_assert(cases[0xE].size(), A); + return cases; } diff --git a/src/core/group/internal/group_union.inl b/src/core/group/internal/group_union.inl index 8950aad..23e0dff 100644 --- a/src/core/group/internal/group_union.inl +++ b/src/core/group/internal/group_union.inl @@ -1,66 +1,9 @@ #pragma once -#include +#include "constant/group_union.h" namespace klotski::cases { -// TODO: using std::array -const uint16_t GROUP_NUM[203] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 3, 79, 1, 1, 1, 1, 1, 1, 1, 1, 1, 21, 141, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 1, 1, 1, 1, 1, 1, - 1, 17, 273, 1, 1, 1, 1, 1, 1, 9, 145, 841, 1, 1, 1, 1, - 1, 1, 15, 97, 517, 1, 1, 1, 1, 1, 1, 1, 5, 91, 1, 1, - 1, 1, 1, 59, 587, 1, 1, 1, 1, 21, 353, 1741, 1, 1, 1, 7, - 81, 479, 2327, 1, 1, 1, 5, 33, 165, 1053, 1, 1, 1, 1, 1, 9, - 157, 1, 1, 1, 57, 505, 1, 1, 13, 325, 1729, 3, 9, 99, 631, 2609, - 1, 17, 91, 487, 2653, 1, 1, 11, 75, 898, 2, 2, 2, 2, 80, 1, - 2, 138, 14, 126, 590, 22, 183, 1074, 33, 209, 1178, 13, 171, 1185, 6, 16, - 214, 6, 18, 54, 2, 44, 40, 124, 84, 70, 18, -}; - -const uint32_t GROUP_MAX_SIZE[203] = { - 12, 192, 1440, 6720, 21840, 52416, 96096, 137280, 154440, 137280, 96096, 52416, - 21840, 6720, 1440, 124, 1736, 11284, 45136, 124124, 248248, 372372, 425568, 372372, - 248248, 124124, 45136, 10836, 132, 1848, 12012, 48048, 132132, 264264, 396396, 453024, - 396396, 264264, 132132, 48048, 11916, 512, 6144, 33792, 112640, 253440, 405504, 473088, - 405504, 253440, 112576, 30104, 1044, 12528, 68904, 229680, 516780, 826848, 964656, 826848, - 516780, 228848, 65848, 582, 6984, 38412, 128040, 288090, 460944, 537768, 460944, 288090, - 128040, 37740, 1092, 10920, 49140, 131040, 229320, 275184, 229320, 130032, 38672, 3180, - 31800, 143100, 381600, 667800, 801360, 667544, 377408, 127676, 3382, 33820, 152190, 405840, - 710220, 852264, 709388, 403056, 143462, 1320, 13200, 59400, 158400, 277200, 332640, 277200, - 158272, 57524, 1320, 10560, 36960, 73920, 92400, 71944, 23704, 4680, 37440, 131040, - 262080, 327120, 253968, 105064, 7248, 57984, 202944, 405440, 504616, 396284, 175580, 5344, - 42752, 149632, 299136, 373184, 296520, 136040, 1632, 13056, 45696, 91392, 114240, 91264, - 43704, 948, 5688, 14220, 17696, 7888, 3444, 20664, 51044, 61204, 28832, 7048, - 42288, 104540, 132556, 81462, 7284, 42728, 104960, 135192, 81340, 4392, 26352, 65688, - 86968, 25955, 522, 3132, 7830, 10440, 7462, 396, 792, 508, 240, 768, - 742, 1804, 2348, 1398, 1504, 5372, 1192, 2984, 4376, 453, 350, 1380, - 1532, 45, 66, 38, 44, 5, 82, 21, 23, 24, 21, -}; - -const uint32_t GROUP_UNION_SIZE[203] = { - 12, 192, 1440, 6720, 21840, 52416, 96096, 137280, 154440, 137280, 96096, 52416, - 21840, 6720, 1440, 124, 1736, 11284, 45136, 124124, 248248, 372372, 425568, 372372, - 248248, 124124, 45136, 11284, 132, 1848, 12012, 48048, 132132, 264264, 396396, 453024, - 396396, 264264, 132132, 48048, 12012, 512, 6144, 33792, 112640, 253440, 405504, 473088, - 405504, 253440, 112640, 33792, 1044, 12528, 68904, 229680, 516780, 826848, 964656, 826848, - 516780, 229680, 68904, 582, 6984, 38412, 128040, 288090, 460944, 537768, 460944, 288090, - 128040, 38412, 1092, 10920, 49140, 131040, 229320, 275184, 229320, 131040, 49140, 3180, - 31800, 143100, 381600, 667800, 801360, 667800, 381600, 143100, 3382, 33820, 152190, 405840, - 710220, 852264, 710220, 405840, 152190, 1320, 13200, 59400, 158400, 277200, 332640, 277200, - 158400, 59400, 1320, 10560, 36960, 73920, 92400, 73920, 36960, 4680, 37440, 131040, - 262080, 327600, 262080, 131040, 7248, 57984, 202944, 405888, 507360, 405888, 202944, 5344, - 42752, 149632, 299264, 374080, 299264, 149632, 1632, 13056, 45696, 91392, 114240, 91392, - 45696, 948, 5688, 14220, 18960, 14220, 3444, 20664, 51660, 68880, 51660, 7120, - 42720, 106800, 142400, 106800, 7284, 43704, 109260, 145680, 109260, 4392, 26352, 65880, - 87840, 65880, 1044, 6264, 15660, 20880, 15660, 396, 1584, 2376, 1260, 5040, - 7560, 3084, 12336, 18504, 4288, 17152, 25728, 3196, 12784, 19176, 1836, 7344, - 11016, 270, 1080, 1620, 88, 180, 626, 772, 1036, 464, 342, -}; - // ------------------------------------------------------------------------------------- // inline uint32_t GroupUnion::unwrap() const { @@ -89,7 +32,7 @@ inline uint32_t GroupUnion::group_num() const { } inline uint32_t GroupUnion::max_group_size() const { - return GROUP_MAX_SIZE[type_id_]; + return MAX_GROUP_SIZE[type_id_]; } inline std::vector GroupUnion::groups() const { diff --git a/src/core/main.cc b/src/core/main.cc index 5450a6f..cb74819 100644 --- a/src/core/main.cc +++ b/src/core/main.cc @@ -34,10 +34,12 @@ int main() { const auto start = std::chrono::system_clock::now(); - AllCases::instance().build(); + // AllCases::instance().build(); - // auto ret = GroupUnion::unsafe_create(169).cases(); - // std::cout << ret[4].size() << std::endl; + for (int type_id = 0; type_id < klotski::cases::TYPE_ID_LIMIT; ++type_id) { + auto ret = GroupUnion::unsafe_create(type_id).cases(); + // std::cout << ret[4].size() << std::endl; + } std::cerr << std::chrono::system_clock::now() - start << std::endl; diff --git a/src/core/ranges/ranges.h b/src/core/ranges/ranges.h index cffb7fb..1b6d633 100644 --- a/src/core/ranges/ranges.h +++ b/src/core/ranges/ranges.h @@ -12,6 +12,8 @@ public: /// Spawn klotski-ranges that match the specified block numbers. void spawn(int n, int n_2x1, int n_1x1); + void reverse(); + /// Derive the legal klotski-ranges with specified head. void derive(int head, Ranges &output) const; @@ -19,9 +21,16 @@ public: static KLSK_INLINE int check(int head, uint32_t range); }; -typedef std::array RangesUnion; +// typedef std::array RangesUnion; + +class RangesUnion final : public std::array { + std::vector codes(); +}; -// TODO: add RangesUnion here -// TODO: -> spawn from Ranges / export std::vector +inline void Ranges::reverse() { + for (auto &x : *this) { + x = range_reverse(x); + } +} } // namespace klotski::cases