#include <iostream>
#include <vector>
#include <string>
#include "Search.h" // min2phase 提供的头文件
// 数字 → Kociemba 所需字符的映射表
const char num2char[6] = {'U','R','F','D','L','B'};
int main() {
std::cout << "请输入 54 个数字(0\~5),顺序为 U R F D L B(每面 9 格),"
"黄面(5)必须在 U 面(前 9 位):" << std::endl;
std::vector<int> nums;
int x;
while (std::cin >> x) {
nums.push_back(x);
if (nums.size() == 54) break; // 读取到 54 个即停止
}
// ---------- 基础校验 ----------
if (nums.size() != 54) {
std::cerr << "错误:需要恰好 54 个数字,实际读取到 "
<< nums.size() << " 个。" << std::endl;
return 1;
}
for (size_t i = 0; i < nums.size(); ++i) {
if (nums[i] < 0 || nums[i] > 5) {
std::cerr << "错误:第 " << i+1 << " 个数字超出范围(0\~5)。" << std::endl;
return 1;
}
}
// 检查黄面是否全部在 U 面(前 9 位)
for (int i = 0; i < 9; ++i) {
if (nums[i] != 5) {
std::cerr << "错误:U 面(前 9 位)必须全部为 5(黄),"
<< "第 " << i+1 << " 位为 " << nums[i] << "。" << std::endl;
return 1;
}
}
// ---------- 构造 Kociemba 所需的 54 字符串 ----------
std::string cube_state;
cube_state.reserve(54);
for (int v : nums) {
cube_state.push_back( num2char[v] );
}
// ---------- 调用二阶段求解 ----------
// 参数说明:solution(状态, 最大步数, 最大搜索节点, 0, 0)
// 这里把最大步数设为 0,让算法自行决定最短解;搜索节点上限设为 1e8。
std::string solution = cs::min2phase::Search().solution(
cube_state, 0, 100000000, 0, 0);
std::cout << "\n输入的魔方状态对应的求解步骤为:" << std::endl;
std::cout << solution << std::endl;
return 0;
}
草稿本!!!
于 2024-11-17 11:33:27 首次发布
726

被折叠的 条评论
为什么被折叠?



