diff --git a/HRD_cal.cpp b/HRD_cal.cpp index 586f8b7..7d8a676 100644 --- a/HRD_cal.cpp +++ b/HRD_cal.cpp @@ -1,4 +1,3 @@ -#include #include #include #include @@ -6,10 +5,13 @@ vector HRD_cal::Calculate_All(unsigned long long Code) { // 寻找整个群的全部元素 unsigned int i; + vector data; init_data(); // 初始化 mode = 0; // 设置模式为全集计算 + if (Check_Code(Code) == false) { // 编码错误 + return data; // 返回空序列 + } cal(Code); // 进行广搜 - vector data; for (i = 0; i < List.size(); i++) { data.push_back((*List[i]).code); // 储存计算结果 } @@ -18,6 +20,9 @@ vector HRD_cal::Calculate_All(unsigned long long Code) { // vector HRD_cal::Calculate(unsigned long long Code, unsigned long long target) { // 寻找到target的最短路径 vector temp; + if (Check_Code(Code) == false || Check_Code(target) == false) { // 编码错误 + return temp; // 返回空序列 + } if (Code == target) { // 若输入为target temp.push_back(Code); return temp; @@ -35,6 +40,9 @@ vector HRD_cal::Calculate(unsigned long long Code, unsigned vector HRD_cal::Calculate(unsigned long long Code) { // 寻找最少步解 vector temp; + if (Check_Code(Code) == false) { // 编码错误 + return temp; // 返回空序列 + } if ((Code >> 32) == 0xD) { // 若输入已经为解 temp.push_back(Code); return temp; @@ -74,15 +82,23 @@ void HRD_cal::init_data() { // 初始化数据结构 List_source.clear(); } -void HRD_cal::cal(unsigned long long Code) { // 广搜寻找目标 (输入编码不能出错) +bool HRD_cal::Check_Code(unsigned long long Code) { + Case_cal dat; + return Parse_Code(dat, Code); +} + +void HRD_cal::cal(unsigned long long Code) { // 广搜寻找目标 Case_cal *start = new Case_cal; - Parse_Code(*start, Code); // 解译输入编码 - List.push_back(start); // 加入根节点 - List_source.push_back(0); - List_hash[0xffff & ((*start).code >> 16)].push_back(start); now_move = 0; // 设置起始搜索节点编号为0 result = 0; flag = false; // 设置为暂未找到 + if (Parse_Code(*start, Code) == false) { // 若输入编码错误 退出 + delete start; + return; + } + List.push_back(start); // 加入根节点 + List_source.push_back(0); + List_hash[0xffff & ((*start).code >> 16)].push_back(start); while (1 == 1) { // 创建死循环 Find_Next_Case(*List[now_move]); if (flag == true) {break;} // 若找到则退出 @@ -96,6 +112,7 @@ void HRD_cal::Add_Case(Case_cal *dat) { // 将找到的布局加入队列中 int hash_index = 0xffff & ((*dat).code >> 16); // 取得哈希索引 for (i = 0; i < List_hash[hash_index].size(); i++) { // 遍历索引内容 if ((*List_hash[hash_index][i]).code == (*dat).code) { // 发现重复 + // 通过freeze表合并来屏蔽不必要的移动 for (x = 0; x < 4; x++) { // 遍历freeze表 for (y = 0; y < 5; y++) { if ((*dat).freeze[x][y] == true) { // 将输入表合并到原先的表上 diff --git a/HRD_cal.h b/HRD_cal.h index 7913c93..1491cff 100644 --- a/HRD_cal.h +++ b/HRD_cal.h @@ -9,6 +9,7 @@ class HRD_cal { public: unsigned long long Change_int (char str[10]); string Change_str(unsigned long long dat); + bool Check_Code(unsigned long long Code); vector Calculate(unsigned long long Code); vector Calculate_All(unsigned long long Code); vector Calculate(unsigned long long Code, unsigned long long target);