From 8c92322b9d75afee2d1025a1b22fcf6f509a48c0 Mon Sep 17 00:00:00 2001 From: Dnomd343 Date: Wed, 1 Jul 2020 21:09:48 +0800 Subject: [PATCH] add HRD_group --- database.cpp => HRD_group.cpp | 123 ++++++++++++++++++++++------------ 1 file changed, 80 insertions(+), 43 deletions(-) rename database.cpp => HRD_group.cpp (84%) diff --git a/database.cpp b/HRD_group.cpp similarity index 84% rename from database.cpp rename to HRD_group.cpp index 8972f12..1b0b762 100644 --- a/database.cpp +++ b/HRD_group.cpp @@ -1,11 +1,13 @@ #include #include #include +#include #include +#include "HRD_cal.h" using namespace std; -ifstream File_Input; -ofstream File_Output; +ofstream output_farthest; +ofstream output_solution; struct Case_cal { unsigned long long code; @@ -20,6 +22,7 @@ struct Case { vector Next; }; struct Case_detail { + unsigned long long code; int farthest_step; int farthest_num; vector farthest_case; @@ -34,6 +37,9 @@ struct Case_detail { }; 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); @@ -42,33 +48,33 @@ 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 Sort(vector &dat); void Case_detail_init(Case_detail &dat); -void Show_detail(Case_detail *dat); Case_detail* Analyse_Case(Case *start); -vector Analyse_Group(vector dat); +void Analyse_Group(vector dat); +void Output_detail(Case_detail *dat); int main() { - cout << "HRD Database by Dnomd343" << endl; + cout << "HRD batch analyser by Dnomd343" << endl; + HRD_cal cal; + unsigned long long seed; vector dat; - char str[10]; - File_Input.open("group_bakk.txt"); - while (File_Input.eof() != true) { - File_Input >> str; - dat.push_back(Change_int(str)); + seed = 0x1A9BF0C00; + if (cal.Check_Code(seed) == false) { + return 0; } - File_Input.close(); - cout << "Press ENTER to Start..."; - cin.get(); - vector res; - res = Analyse_Group(dat); - Show_detail(res[0]); + dat = cal.Calculate_All(seed); + sort(dat.begin(), dat.end()); + File_name_farthest = "farthest.csv"; + File_name_solution = "solution.csv"; + Output_solution_case = true; + + Analyse_Group(dat); cout << "bye..." << endl; return 0; } -vector Analyse_Group(vector dat) { - int i, j, k; +void Analyse_Group(vector dat) { // 传入整个群 并将结果以csv格式输出到文件 + unsigned int i, j, k; int hash_index; vector List; // 全组数据 vector List_hash[0x10000]; // 哈希索引 @@ -97,53 +103,96 @@ vector Analyse_Group(vector dat) { } } } - vector result; + Case_detail *result; + output_farthest.open(File_name_farthest); + output_solution.open(File_name_solution); for(i = 0; i < List.size(); i++) { // 遍历整个队列 for (k = 0; k < List.size(); k++) { // 初始化 (*List[k]).Layer_num = -1; (*List[k]).Flag = false; } - result.push_back(Analyse_Case(List[i])); // 计算对应布局数据并储存到result中 + result = Analyse_Case(List[i]); // 计算对应布局数据并储存到result中 + Output_detail(result); + delete result; if (i % 13 == 0) { cout << i << "/" << List.size() << endl; } } + output_farthest.close(); + output_solution.close(); for (i = 0; i < List.size(); i++) { // 释放List数据 delete List[i]; } - return result; } +void Output_detail(Case_detail *dat) { + unsigned int i; + // farthest + output_farthest << Change_str((*dat).code) << ","; + output_farthest << (*dat).farthest_step << ","; + output_farthest << (*dat).farthest_num << ","; + for (i = 0; i < (*dat).farthest_case.size(); i++) { + output_farthest << Change_str((*dat).farthest_case[i]); + if (i + 1 != (*dat).farthest_case.size()) { + output_farthest << "-"; + } + } + output_farthest << endl; + // solution + output_solution << Change_str((*dat).code) << ","; + output_solution << (*dat).min_solution_step << ","; + output_solution << (*dat).min_solution_num << ","; + for (i = 0; i < (*dat).min_solution_case.size(); i++) { + output_solution << Change_str((*dat).min_solution_case[i]); + if (i + 1 != (*dat).min_solution_case.size()) { + output_solution << "-"; + } + } + output_solution << "," << (*dat).solution_num; + if (Output_solution_case == false) {return;} + output_solution << ","; + for (i = 0; i < (*dat).solution_case.size(); i++) { + output_solution << Change_str((*dat).solution_case[i]); + output_solution << "(" << (*dat).solution_step[i] << ")"; + if (i + 1 != (*dat).solution_case.size()) { + output_solution << "-"; + } + } + output_solution << endl; +} +/* void Show_detail(Case_detail *dat) { + unsigned int i; cout << "============================" << endl; cout << "farthest_step = " << (*dat).farthest_step << endl; cout << "farthest_num = " << (*dat).farthest_num << endl; cout << "farthest_case: " << endl; - for (int i = 0; i < (*dat).farthest_case.size(); i++) { + for (i = 0; i < (*dat).farthest_case.size(); i++) { cout << " " << Change_str((*dat).farthest_case[i]) << endl; } cout << "============================" << endl; cout << "min_solution_step = " << (*dat).min_solution_step << endl; cout << "min_solution_num = " << (*dat).min_solution_num << endl; cout << "min_solution_case: " << endl; - for (int i = 0; i < (*dat).min_solution_case.size(); i++) { + for (i = 0; i < (*dat).min_solution_case.size(); i++) { cout << " " << Change_str((*dat).min_solution_case[i]) << endl; } cout << "============================" << endl; cout << "solution_num = " << (*dat).solution_num << endl; cout << "solution_case(solution_step): " << endl; - for (int i = 0; i < (*dat).solution_case.size(); i++) { + for (i = 0; i < (*dat).solution_case.size(); i++) { cout << " " << Change_str((*dat).solution_case[i]); cout << "(" << (*dat).solution_step[i] << ")" << endl; } cout << "============================" << endl; } - +*/ Case_detail* Analyse_Case(Case *start) { // 根据关系网计算布局的参数 - int i, k; + unsigned int i, k; vector Case_Stack; Case_detail *dat = new Case_detail; // dat储存分析结果 Case_detail_init(*dat); // 初始化 + (*dat).code = (*start).Code; (*start).Layer_num = 0; //令入口节点的层级为0 Case_Stack.push_back(start); // 加入队列中 i = 0; @@ -179,13 +228,13 @@ Case_detail* Analyse_Case(Case *start) { // 根据关系网计算布局的参数 } } (*dat).farthest_num = (*dat).farthest_case.size(); // 得到最远布局的个数 - Sort((*dat).farthest_case); + sort((*dat).farthest_case.begin(), (*dat).farthest_case.end()); // 计算解的情况 (*dat).solution_num = (*dat).solution_case.size(); // 得到解的个数 int step = -1; vector < vector > temp; // 暂存不同步数解的信息 for (i = 0; i < (*dat).solution_step.size(); i++) { // 遍历全部解 - if (step != (*dat).solution_step[i]) { // 发现步数不同 + if (step != int((*dat).solution_step[i])) { // 发现步数不同 temp.resize(temp.size() + 1); // temp扩容 step = (*dat).solution_step[i]; // 重置步数 } @@ -193,7 +242,7 @@ Case_detail* Analyse_Case(Case *start) { // 根据关系网计算布局的参数 } (*dat).solution_case.clear(); // 清空原数据 for (i = 0; i < temp.size(); i++) { // 将排序后的数据重新写入 - Sort(temp[i]); // 排序同一步数的不同解 + sort(temp[i].begin(), temp[i].end()); // 排序同一步数的不同解 if (i == 0) { // 若为最少步数 (*dat).min_solution_case = temp[0]; // 记录最少步解的布局 (*dat).min_solution_num = temp[0].size(); // 记录最少步解的个数 @@ -218,18 +267,6 @@ void Case_detail_init(Case_detail &dat) { // 初始化数据 dat.solution_step.clear(); } -void Sort(vector &dat) { // 将输入的vector排序 (从小到大) - unsigned int i, j; - if (dat.size() == 0) {return;} // 空的则退出 - for (i = 0; i < dat.size() - 1; i++) { // 冒泡排序 - for (j = 0; j < dat.size() - 1 - i; j++) { - if (dat[j] >= dat[j + 1]) { - swap(dat[j], dat[j + 1]); - } - } - } -} - vector Find_Next_Case(unsigned long long Code) { // 找到下一步移动的情况(一步可以为同一块多次移动) int num, x, y, i, j; bool addr[4][5]; // 在Find_Sub_Case深搜中用于剪枝 @@ -388,7 +425,7 @@ void Build_Case(Case_cal &dat, int &num, int x, int y, bool addr[4][5]) { // 实 Case_cal dat_mod = dat; // 新建对象 在Add_Case中加入层中或被释放 switch (dat_mod.type[num]) { // 注入移动后的信息 case 0: // 2 * 2 - dat_mod.status[x][y] = dat_mod.status[x][y + 1] + dat_mod.status[x][y] = dat_mod.status[x][y + 1] = dat_mod.status[x + 1][y] = dat_mod.status[x + 1][y + 1] = num; break; case 1: // 2 * 1