diff --git a/HRD_analy.cpp b/HRD_analy.cpp index aa998dd..0cb543c 100644 --- a/HRD_analy.cpp +++ b/HRD_analy.cpp @@ -75,7 +75,7 @@ void HRD_analy::Output_Detail(string File_name) { // 输出分析结果到文件 } } -void HRD_analy::Analyse_Case(unsigned long long code) { // 分析输入编码的各种参数 (输入编码必须无误) +void HRD_analy::Analyse_Case(unsigned long long code) { // 分析输入编码的各种参数 vector < vector > solution_flag; vector temp; unsigned int i, j, k; @@ -88,6 +88,7 @@ void HRD_analy::Analyse_Case(unsigned long long code) { // 分析输入编码的 solution_num = 0; // 初始化solution solution_case.clear(); solution_step.clear(); + if (Check_Code(code) == false) {return;} // 若编码错误则退出 Calculate(code); // 计算分层数据 solution_flag.resize(Layer.size()); // 同步Layer的结构 for (i = 0; i < solution_flag.size(); i++) { @@ -130,7 +131,6 @@ void HRD_analy::Analyse_Case(unsigned long long code) { // 分析输入编码的 if (solution_flag[i][j] == true) { // 若该元素被标识 case_list = (*(*Layer[i][j]).adjacent).next_case; for (k = 0; k < case_list.size(); k++) { // 遍历其下一步 - //solution_flag[i + 1][Layer_Next[i][j][k]] = true; solution_flag[i + 1][(*case_list[k]).layer_index] = true; // 标识 } } @@ -193,7 +193,11 @@ void HRD_analy::Calculate(unsigned long long code) { Free_Data(); // 初始化数据结构 Case_cal *start = new Case_cal; (*start).adjacent = new Case_near; - Parse_Code(*start, code); // 解译输入编码 + if (Parse_Code(*start, code) == false) { // 若输入编码错误 退出 + delete (*start).adjacent; + delete start; + return; + } Layer.resize(1); // 创建第0层 Layer[0].push_back(start); // 加入根节点 (*start).layer_num = (*start).layer_index = 0; // 初始化根节点编号 @@ -432,6 +436,11 @@ void HRD_analy::Build_Case(Case_cal &dat, int &num, int x, int y, bool addr[4][5 Find_Sub_Case(dat, num, x, y, addr); // 递归搜索 } +bool HRD_analy::Check_Code(unsigned long long code) { + Case_cal dat; + return Parse_Code(dat, code); +} + void HRD_analy::Get_Code(Case_cal &dat) { // 获取编码并存储在dat.code 输入数据必须无误 bool temp[4][5]; // 用于临时标记 int x, y, num; @@ -479,6 +488,11 @@ void HRD_analy::Get_Code(Case_cal &dat) { // 获取编码并存储在dat.code dat.code &= 0xFFFFFFFFF; // 清除高28位内容 } +bool HRD_analy::Parse_Code(unsigned long long Code) { + Parse_dat.layer_num = Parse_dat.layer_index = 0; + return Parse_Code(Parse_dat, Code); +} + bool HRD_analy::Parse_Code(Case_cal &dat, unsigned long long Code) { // 解析编码 返回false表示编码有误 unsigned char range[16]; // dat低32位分16组 int i, x, y, num, space_num = 0; diff --git a/HRD_analy.h b/HRD_analy.h index c4026f5..3678058 100644 --- a/HRD_analy.h +++ b/HRD_analy.h @@ -21,29 +21,31 @@ class HRD_analy { vector source_case; vector next_case; }; - vector > Layer; // ȫݵĽڵ - bool quiet = false; // true -> Ĭģʽ false -> - // ֵĻ - int min_solution_step; // ٵIJ - int min_solution_num; // ٲĸ - vector min_solution_case; // ٲ - vector solution_step; // нӦIJ - int solution_num; // ĸ - vector solution_case; // н - int farthest_step; // ԶֵIJ - int farthest_num; // Զֵĸ - vector farthest_case; // ԶIJ + vector > Layer; // 储存全部层数据的节点 + Case_cal Parse_dat; + bool quiet = false; // true -> 静默模式 false -> 输出运算情况 + // 布局的基本参数 + int min_solution_step; // 最少的步数 + int min_solution_num; // 最少步解的个数 + vector min_solution_case; // 所有最少步解 + vector solution_step; // 所有解对应的步数 + int solution_num; // 解的个数 + vector solution_case; // 所有解 + int farthest_step; // 最远布局的步数 + int farthest_num; // 最远布局的个数 + vector farthest_case; // 所有最远的布局 unsigned long long Change_int (char str[10]); string Change_str(unsigned long long dat); + bool Check_Code(unsigned long long code); + bool Parse_Code(unsigned long long Code); void Analyse_Case(unsigned long long code); void Output_Detail(string File_name); private: - vector Layer_hash[0x10000]; // ϣ + vector Layer_hash[0x10000]; // 哈希表 Case_cal *now_move_case; - unsigned int now_move_num, now_move_index; // ǰɨڵIJ / ǰɨڵIJб - + unsigned int now_move_num, now_move_index; // 当前扫描节点的层编号 / 当前扫描节点的层中编号 bool Parse_Code(Case_cal &dat, unsigned long long Code); void Get_Code(Case_cal &dat); void Find_Sub_Case(Case_cal &dat, int &num, int x, int y, bool addr[4][5]);