Browse Source

update HRD_analy

master
Dnomd343 4 years ago
parent
commit
7bf322efef
  1. 20
      HRD_analy.cpp
  2. 32
      HRD_analy.h

20
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 <bool> > solution_flag;
vector <unsigned long long> 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;

32
HRD_analy.h

@ -21,29 +21,31 @@ class HRD_analy {
vector <Case_cal *> source_case;
vector <Case_cal *> next_case;
};
vector <vector <Case_cal *> > Layer; // 储存全部层数据的节点
bool quiet = false; // true -> 静默模式 false -> 输出运算情况
// 布局的基本参数
int min_solution_step; // 最少的步数
int min_solution_num; // 最少步解的个数
vector <unsigned long long> min_solution_case; // 所有最少步解
vector <unsigned int> solution_step; // 所有解对应的步数
int solution_num; // 解的个数
vector <unsigned long long> solution_case; // 所有解
int farthest_step; // 最远布局的步数
int farthest_num; // 最远布局的个数
vector <unsigned long long> farthest_case; // 所有最远的布局
vector <vector <Case_cal *> > Layer; // 储存全部层数据的节点
Case_cal Parse_dat;
bool quiet = false; // true -> 静默模式 false -> 输出运算情况
// 布局的基本参数
int min_solution_step; // 最少的步数
int min_solution_num; // 最少步解的个数
vector <unsigned long long> min_solution_case; // 所有最少步解
vector <unsigned int> solution_step; // 所有解对应的步数
int solution_num; // 解的个数
vector <unsigned long long> solution_case; // 所有解
int farthest_step; // 最远布局的步数
int farthest_num; // 最远布局的个数
vector <unsigned long long> 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 <Case_cal *> Layer_hash[0x10000]; // 哈希表
vector <Case_cal *> Layer_hash[0x10000]; // 哈希表
Case_cal *now_move_case;
unsigned int now_move_num, now_move_index; // 当前扫描节点的层编号 / 当前扫描节点的层中编号
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]);

Loading…
Cancel
Save