Browse Source

update HRD_analy

master
Dnomd343 4 years ago
parent
commit
177788a6ff
  1. 81
      src/engine/HRD_analy.cpp
  2. 2
      src/engine/HRD_analy.h

81
src/engine/HRD_analy.cpp

@ -100,6 +100,87 @@ void HRD_analy::Output_Graph(unsigned long long code, unsigned int square_width,
cout << endl;
}
bool HRD_analy::Get_Path(vector <unsigned long long> target, string File_name) {
Case_cal *address;
unsigned int i, j, k, num;
struct Highlight_point {
bool flag;
unsigned int index;
};
vector < vector <Highlight_point> > Highlight;
Highlight.resize(Layer.size()); // 同步Layer的结构
for (i = 0; i < Highlight.size(); i++) {
Highlight[i].resize(Layer[i].size());
for (j = 0; j < Layer[i].size(); j++) {
Highlight[i][j].flag = false;
}
}
for (i = 0; i < target.size(); i++) {
if (!Search_Case(target[i], address)) {return false;}
Highlight[address->layer_num][address->layer_index].flag = true;
}
vector <Case_cal *> *case_list;
for (i = Layer.size() - 1; i > 0; i--) { // 反向遍历除第一层外的所有层
num = 0;
for (j = 0; j < Layer[i].size(); j++) { // 遍历层内元素
if (Highlight[i][j].flag) { // 若该元素被标识
case_list = Layer[i][j]->source_case;
for (k = 0; k < case_list->size(); k++) { // 遍历其下一步
Highlight[i - 1][(*case_list->at(k)).layer_index].flag = true; // 标识
}
Highlight[i][j].index = num;
num++;
}
}
}
Highlight[0][0].index = 0;
ofstream output;
output.open(File_name);
output << "[Target]" << endl;
for (i = 0; i < target.size(); i++) {
output << Change_str(target[i]) << endl;
}
output << "[Layer]" << endl;
for (i = 0; i < Layer.size(); i++) { // 反向遍历除第一层外的所有层
if (Layer[i].size() == 0) {break;}
for (j = 0; j < Layer[i].size(); j++) { // 遍历层内元素
if (Highlight[i][j].flag) {
output << "(" << i << "," << Highlight[i][j].index << ") = " << Change_str(Layer[i][j]->code) << endl;
}
}
}
output << "[Next]" << endl;
for (i = 0; i < Layer.size(); i++) { // 反向遍历除第一层外的所有层
if (Layer[i].size() == 0) {break;}
for (j = 0; j < Layer[i].size(); j++) { // 遍历层内元素
if (Highlight[i][j].flag) {
output << "(" << i << "," << Highlight[i][j].index << ") ->";
case_list = Layer[i][j]->next_case;
for (k = 0; k < case_list->size(); k++) { // 遍历其下一步
if (Highlight[i + 1][(*case_list->at(k)).layer_index].flag) {
output << " (" << i + 1 << "," << Highlight[i + 1][(*case_list->at(k)).layer_index].index << ")";
}
}
output << endl;
}
}
}
output.close();
return true;
}
bool HRD_analy::Search_Case(unsigned long long code, Case_cal* &dat) {
unsigned int i;
int hash_index = 0xffff & (code >> 16); // 取得哈希索引
for (i = 0; i < Layer_hash[hash_index].size(); i++) { // 遍历索引内容
if (Layer_hash[hash_index][i]->code == code) { // 发现目标
dat = Layer_hash[hash_index][i];
return true;
}
}
return false;
}
void HRD_analy::Output_Detail(string File_name) { // 输出分析结果到文件
unsigned int i, j, k;
ofstream output;

2
src/engine/HRD_analy.h

@ -39,6 +39,7 @@ class HRD_analy {
bool Is_Mirror(unsigned long long code);
void Analyse_Case(unsigned long long code);
void Output_Detail(string File_name);
bool Get_Path(vector <unsigned long long> target, string File_name);
void Free_Data();
void Output_Graph(unsigned long long code, unsigned int square_width, unsigned int square_gap, char str[2]);
@ -53,6 +54,7 @@ class HRD_analy {
void Find_Next_Case(Case_cal &dat_raw);
void Add_Case(Case_cal *dat);
void Calculate(unsigned long long code);
bool Search_Case(unsigned long long code, Case_cal* &dat);
};
#endif

Loading…
Cancel
Save