From a2476227fb07c5f302a6be19815f590a095f311b Mon Sep 17 00:00:00 2001 From: Dnomd343 Date: Wed, 1 Jul 2020 21:45:23 +0800 Subject: [PATCH] update HRD_group --- HRD_group.cpp | 78 +++++++++------------------------------------------ HRD_group.h | 57 +++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 65 deletions(-) create mode 100644 HRD_group.h diff --git a/HRD_group.cpp b/HRD_group.cpp index 3650f4e..debe996 100644 --- a/HRD_group.cpp +++ b/HRD_group.cpp @@ -4,64 +4,12 @@ #include #include #include "HRD_cal.h" -using namespace std; +#include "HRD_group.h" ofstream output_farthest; ofstream output_solution; -struct Case_cal { - unsigned long long code; - unsigned char status[4][5]; // 0xFF -> undefined ; 0xFE -> space - unsigned char type[15]; // 0 -> 2 * 2 ; 1 -> 2 * 1 ; 2 -> 1 * 2 ; 3 -> 1 * 1 -}; -struct Case { - unsigned long long Code; - int Layer_num; - bool Flag; - unsigned int addr_2x2; - vector Next; -}; -struct Case_detail { - unsigned long long code; - int farthest_step; - int farthest_num; - vector farthest_case; - - int min_solution_step; - int min_solution_num; - vector min_solution_case; - - int solution_num; - vector solution_case; - vector solution_step; -}; - -vector Next_Case_dat; // 储存Find_Next_Case找到的结果 -string File_name_farthest; -string File_name_solution; -bool Output_solution_case; - -unsigned long long Change_int(char str[10]); -string Change_str(unsigned long long dat); -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]); -void Build_Case(Case_cal &dat, int &num, int x, int y, bool addr[4][5]); -vector Find_Next_Case(unsigned long long Code); -void Case_detail_init(Case_detail &dat); -Case_detail* Analyse_Case(Case *start); -void Analyse_Group(vector dat); -void Output_detail(Case_detail *dat); -void Batch_Analyse(unsigned long long seed, string name_farthest, string name_solution, bool is_output_solution); - -int main() { - cout << "HRD batch analyser by Dnomd343" << endl; - Batch_Analyse(0x1A9BF0C00, "farthest.csv", "solution.csv", false); - cout << "bye..." << endl; - return 0; -} - -void Batch_Analyse(unsigned long long seed, string name_farthest, string name_solution, bool is_output_solution) { +void HRD_group::Batch_Analyse(unsigned long long seed, string name_farthest, string name_solution, bool is_output_solution) { HRD_cal cal; vector dat; if (cal.Check_Code(seed) == false) {return;} @@ -73,7 +21,7 @@ void Batch_Analyse(unsigned long long seed, string name_farthest, string name_so Analyse_Group(dat); } -void Analyse_Group(vector dat) { // 传入整个群 并将结果以csv格式输出到文件 +void HRD_group::Analyse_Group(vector dat) { // 传入整个群 并将结果以csv格式输出到文件 unsigned int i, j, k; int hash_index; vector List; // 全组数据 @@ -125,7 +73,7 @@ void Analyse_Group(vector dat) { // 传入整个群 并将 } } -void Output_detail(Case_detail *dat) { +void HRD_group::Output_detail(Case_detail *dat) { unsigned int i; // farthest output_farthest << Change_str((*dat).code) << ","; @@ -164,7 +112,7 @@ void Output_detail(Case_detail *dat) { output_solution << endl; } -Case_detail* Analyse_Case(Case *start) { // 根据关系网计算布局的参数 +HRD_group::Case_detail* HRD_group::Analyse_Case(Case *start) { // 根据关系网计算布局的参数 unsigned int i, k; vector Case_Stack; Case_detail *dat = new Case_detail; // dat储存分析结果 @@ -232,7 +180,7 @@ Case_detail* Analyse_Case(Case *start) { // 根据关系网计算布局的参数 return dat; } -void Case_detail_init(Case_detail &dat) { // 初始化数据 +void HRD_group::Case_detail_init(Case_detail &dat) { // 初始化数据 dat.farthest_step = -1; dat.farthest_num = 0; dat.farthest_case.clear(); @@ -244,7 +192,7 @@ void Case_detail_init(Case_detail &dat) { // 初始化数据 dat.solution_step.clear(); } -vector Find_Next_Case(unsigned long long Code) { // 找到下一步移动的情况(一步可以为同一块多次移动) +vector HRD_group::Find_Next_Case(unsigned long long Code) { // 找到下一步移动的情况(一步可以为同一块多次移动) int num, x, y, i, j; bool addr[4][5]; // 在Find_Sub_Case深搜中用于剪枝 bool exclude[4][5]; // 排除已搜索过的块 @@ -300,7 +248,7 @@ vector Find_Next_Case(unsigned long long Code) { // 找到 return Next_Case_dat; } -void Find_Sub_Case(Case_cal &dat, int &num, int x, int y, bool addr[4][5]) { // 找到下一个单格移动的情况 +void HRD_group::Find_Sub_Case(Case_cal &dat, int &num, int x, int y, bool addr[4][5]) { // 找到下一个单格移动的情况 switch (dat.type[num]) { case 0: // 2 * 2 if (y != 0) { // 不在最上面 @@ -393,7 +341,7 @@ void Find_Sub_Case(Case_cal &dat, int &num, int x, int y, bool addr[4][5]) { // } } -void Build_Case(Case_cal &dat, int &num, int x, int y, bool addr[4][5]) { // 实现移动并将结果发送到Add_Case +void HRD_group::Build_Case(Case_cal &dat, int &num, int x, int y, bool addr[4][5]) { // 实现移动并将结果发送到Add_Case if (addr[x][y] == true) { // 重复 return; // 退出 } else { @@ -420,7 +368,7 @@ void Build_Case(Case_cal &dat, int &num, int x, int y, bool addr[4][5]) { // 实 Find_Sub_Case(dat, num, x, y, addr); // 递归搜索 } -void Get_Code(Case_cal &dat) { // 获取编码并存储在dat.code 输入数据必须无误 +void HRD_group::Get_Code(Case_cal &dat) { // 获取编码并存储在dat.code 输入数据必须无误 bool temp[4][5]; // 用于临时标记 int x, y, num; dat.code = 0; @@ -467,7 +415,7 @@ void Get_Code(Case_cal &dat) { // 获取编码并存储在dat.code 输入数据 dat.code &= 0xFFFFFFFFF; // 清除高28位内容 } -bool Parse_Code(Case_cal &dat, unsigned long long Code) { // 解析编码 返回false表示编码有误 +bool HRD_group::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; dat.code = Code; @@ -536,7 +484,7 @@ bool Parse_Code(Case_cal &dat, unsigned long long Code) { // 解析编码 返回 return true; // 20格恰好被填满 } -string Change_str(unsigned long long dat) { // 将数字转化为文本编码 +string HRD_group::Change_str(unsigned long long dat) { // 将数字转化为文本编码 string str; str.resize(9); // 修改其长度为9位 for (int i = 8; i >= 0; i--) { // 将每一位从数值转为ASCII码 @@ -550,7 +498,7 @@ string Change_str(unsigned long long dat) { // 将数字转化为文本编码 return str; } -unsigned long long Change_int(char *str) { // 将文本编码转化为数字(传入9位字符串) +unsigned long long HRD_group::Change_int(char *str) { // 将文本编码转化为数字(传入9位字符串) unsigned long long dat = 0; for (int i = 0; i < 9; i++) { // 将每一位从ASCII码转为数值 dat <<= 4; diff --git a/HRD_group.h b/HRD_group.h new file mode 100644 index 0000000..718f3ae --- /dev/null +++ b/HRD_group.h @@ -0,0 +1,57 @@ +#ifndef HRD_group_H +#define HRD_group_H + +#include +#include +using namespace std; + +class HRD_group { + public: + unsigned long long Change_int(char str[10]); + string Change_str(unsigned long long dat); + void Batch_Analyse(unsigned long long seed, string name_farthest, string name_solution, bool is_output_solution); + + private: + struct Case_cal { + unsigned long long code; + unsigned char status[4][5]; // 0xFF -> undefined ; 0xFE -> space + unsigned char type[15]; // 0 -> 2 * 2 ; 1 -> 2 * 1 ; 2 -> 1 * 2 ; 3 -> 1 * 1 + }; + struct Case { + unsigned long long Code; + int Layer_num; + bool Flag; + unsigned int addr_2x2; + vector Next; + }; + struct Case_detail { + unsigned long long code; + int farthest_step; + int farthest_num; + vector farthest_case; + + int min_solution_step; + int min_solution_num; + vector min_solution_case; + + int solution_num; + vector solution_case; + vector solution_step; + }; + vector Next_Case_dat; // Find_Next_CaseҵĽ + string File_name_farthest; + string File_name_solution; + bool Output_solution_case; + + 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]); + void Build_Case(Case_cal &dat, int &num, int x, int y, bool addr[4][5]); + vector Find_Next_Case(unsigned long long Code); + void Case_detail_init(Case_detail &dat); + Case_detail* Analyse_Case(Case *start); + void Analyse_Group(vector dat); + void Output_detail(Case_detail *dat); +}; + +#endif