|
@ -58,27 +58,27 @@ void HRD_group::Analyse_Group(vector <unsigned long long> dat) { // 传入整个 |
|
|
unsigned int i, j, k; |
|
|
unsigned int i, j, k; |
|
|
int hash_index; |
|
|
int hash_index; |
|
|
vector <Case *> List; // 全组数据
|
|
|
vector <Case *> List; // 全组数据
|
|
|
vector <Case *> List_hash[0x10000]; // 哈希索引
|
|
|
vector <Case *> *List_hash = new vector <Case *> [0x10000]; // 哈希索引
|
|
|
for (i = 0; i < dat.size(); i++) { // 将数据注入到List中
|
|
|
for (i = 0; i < dat.size(); i++) { // 将数据注入到List中
|
|
|
Case *temp = new Case; |
|
|
Case *temp = new Case; |
|
|
temp->Code = dat[i]; |
|
|
temp->code = dat[i]; |
|
|
List.push_back(temp); |
|
|
List.push_back(temp); |
|
|
} |
|
|
} |
|
|
for (i = 0; i < List.size(); i++) { // 构建哈希索引表
|
|
|
for (i = 0; i < List.size(); i++) { // 构建哈希索引表
|
|
|
hash_index = 0xffff & (List[i]->Code >> 16); |
|
|
hash_index = 0xffff & (List[i]->code >> 16); |
|
|
List_hash[hash_index].push_back(List[i]); |
|
|
List_hash[hash_index].push_back(List[i]); |
|
|
} |
|
|
} |
|
|
for (i = 0; i < List.size(); i++) { // 计算全部2 * 2块的位置
|
|
|
for (i = 0; i < List.size(); i++) { // 计算全部2 * 2块的位置
|
|
|
List[i]->addr_2x2 = List[i]->Code >> 32; |
|
|
List[i]->addr_2x2 = List[i]->code >> 32; |
|
|
} |
|
|
} |
|
|
vector <unsigned long long> next_code; |
|
|
vector <unsigned long long> next_code; |
|
|
for (i = 0; i < List.size(); i++) { // 构建关系网
|
|
|
for (i = 0; i < List.size(); i++) { // 构建关系网
|
|
|
next_code = Find_Next_Case(List[i]->Code); // 找到全部子布局
|
|
|
next_code = Find_Next_Case(List[i]->code); // 找到全部子布局
|
|
|
for (j = 0; j < next_code.size(); j++) { // 遍历子布局
|
|
|
for (j = 0; j < next_code.size(); j++) { // 遍历子布局
|
|
|
hash_index = 0xffff & (next_code[j] >> 16); // 取得哈希索引
|
|
|
hash_index = 0xffff & (next_code[j] >> 16); // 取得哈希索引
|
|
|
for (k = 0; List_hash[hash_index].size(); k++) { // 搜索该索引
|
|
|
for (k = 0; List_hash[hash_index].size(); k++) { // 搜索该索引
|
|
|
if (List_hash[hash_index][k]->Code == next_code[j]) { // 找到目标
|
|
|
if (List_hash[hash_index][k]->code == next_code[j]) { // 找到目标
|
|
|
List[i]->Next.push_back(List_hash[hash_index][k]); // 链接目标位置
|
|
|
List[i]->next.push_back(List_hash[hash_index][k]); // 链接目标位置
|
|
|
break; // 退出循环
|
|
|
break; // 退出循环
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
@ -87,8 +87,8 @@ void HRD_group::Analyse_Group(vector <unsigned long long> dat) { // 传入整个 |
|
|
Case_detail *result; |
|
|
Case_detail *result; |
|
|
for(i = 0; i < List.size(); i++) { // 遍历整个队列
|
|
|
for(i = 0; i < List.size(); i++) { // 遍历整个队列
|
|
|
for (k = 0; k < List.size(); k++) { // 初始化
|
|
|
for (k = 0; k < List.size(); k++) { // 初始化
|
|
|
List[k]->Layer_num = -1; |
|
|
List[k]->layer_num = -1; |
|
|
List[k]->Flag = false; |
|
|
List[k]->flag = false; |
|
|
} |
|
|
} |
|
|
result = Analyse_Case(List[i]); // 计算对应布局数据并储存到result中
|
|
|
result = Analyse_Case(List[i]); // 计算对应布局数据并储存到result中
|
|
|
Output_detail(result); |
|
|
Output_detail(result); |
|
@ -100,6 +100,7 @@ void HRD_group::Analyse_Group(vector <unsigned long long> dat) { // 传入整个 |
|
|
for (i = 0; i < List.size(); i++) { // 释放List数据
|
|
|
for (i = 0; i < List.size(); i++) { // 释放List数据
|
|
|
delete List[i]; |
|
|
delete List[i]; |
|
|
} |
|
|
} |
|
|
|
|
|
delete[] List_hash; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void HRD_group::Output_detail(Case_detail *dat) { |
|
|
void HRD_group::Output_detail(Case_detail *dat) { |
|
@ -146,36 +147,36 @@ HRD_group::Case_detail* HRD_group::Analyse_Case(Case *start) { // 根据关系 |
|
|
vector <Case *> case_list; |
|
|
vector <Case *> case_list; |
|
|
Case_detail *dat = new Case_detail; // dat储存分析结果
|
|
|
Case_detail *dat = new Case_detail; // dat储存分析结果
|
|
|
Case_detail_init(*dat); // 初始化
|
|
|
Case_detail_init(*dat); // 初始化
|
|
|
dat->code = start->Code; |
|
|
dat->code = start->code; |
|
|
start->Layer_num = 0; //令入口节点的层级为0
|
|
|
start->layer_num = 0; //令入口节点的层级为0
|
|
|
case_list.push_back(start); // 加入队列中
|
|
|
case_list.push_back(start); // 加入队列中
|
|
|
i = 0; |
|
|
i = 0; |
|
|
while (i != case_list.size()) { // 找到所有元素后退出
|
|
|
while (i != case_list.size()) { // 找到所有元素后退出
|
|
|
if ((*case_list[i]).addr_2x2 == 0xD) { // 2 * 2块在出口位置
|
|
|
if ((*case_list[i]).addr_2x2 == 0xD) { // 2 * 2块在出口位置
|
|
|
if (!case_list[i]->Flag) { // 未被标识
|
|
|
if (!case_list[i]->flag) { // 未被标识
|
|
|
dat->solution_case.push_back(case_list[i]->Code); // 判定为解
|
|
|
dat->solution_case.push_back(case_list[i]->code); // 判定为解
|
|
|
dat->solution_step.push_back(case_list[i]->Layer_num); |
|
|
dat->solution_step.push_back(case_list[i]->layer_num); |
|
|
case_list[i]->Flag = true; // 进行标识
|
|
|
case_list[i]->flag = true; // 进行标识
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
for (k = 0; k < case_list[i]->Next.size(); k++) { // 检测目标布局的全部子布局
|
|
|
for (k = 0; k < case_list[i]->next.size(); k++) { // 检测目标布局的全部子布局
|
|
|
if ((*case_list[i]->Next[k]).Layer_num == -1) { // 若之前还未被搜索到
|
|
|
if ((*case_list[i]->next[k]).layer_num == -1) { // 若之前还未被搜索到
|
|
|
(*case_list[i]->Next[k]).Layer_num = case_list[i]->Layer_num + 1; // 记录层级信息
|
|
|
(*case_list[i]->next[k]).layer_num = case_list[i]->layer_num + 1; // 记录层级信息
|
|
|
case_list.push_back(case_list[i]->Next[k]); // 加入搜索队列
|
|
|
case_list.push_back(case_list[i]->next[k]); // 加入搜索队列
|
|
|
} |
|
|
} |
|
|
if (case_list[i]->Flag) { // 若已经标识 则感染下一层的子布局
|
|
|
if (case_list[i]->flag) { // 若已经标识 则感染下一层的子布局
|
|
|
if ((*case_list[i]->Next[k]).Layer_num == case_list[i]->Layer_num + 1) { // 若为下一层
|
|
|
if ((*case_list[i]->next[k]).layer_num == case_list[i]->layer_num + 1) { // 若为下一层
|
|
|
(*case_list[i]->Next[k]).Flag = true; // 标识
|
|
|
(*case_list[i]->next[k]).flag = true; // 标识
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
i++; // 搜索下一个布局
|
|
|
i++; // 搜索下一个布局
|
|
|
} |
|
|
} |
|
|
// 计算最远布局
|
|
|
// 计算最远布局
|
|
|
dat->farthest_step = case_list[case_list.size() - 1]->Layer_num; // 得到最远步数
|
|
|
dat->farthest_step = case_list[case_list.size() - 1]->layer_num; // 得到最远步数
|
|
|
for (int i = case_list.size() - 1; i >= 0; i--) { // 逆向搜索
|
|
|
for (int i = case_list.size() - 1; i >= 0; i--) { // 逆向搜索
|
|
|
if (case_list[i]->Layer_num == dat->farthest_step) { // 如果是最远布局
|
|
|
if (case_list[i]->layer_num == dat->farthest_step) { // 如果是最远布局
|
|
|
dat->farthest_case.push_back(case_list[i]->Code); // 加入记录
|
|
|
dat->farthest_case.push_back(case_list[i]->code); // 加入记录
|
|
|
} else { |
|
|
} else { |
|
|
break; // 退出搜索
|
|
|
break; // 退出搜索
|
|
|
} |
|
|
} |
|
@ -220,12 +221,12 @@ void HRD_group::Case_detail_init(Case_detail &dat) { // 初始化数据 |
|
|
dat.solution_step.clear(); |
|
|
dat.solution_step.clear(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
vector <unsigned long long> HRD_group::Find_Next_Case(unsigned long long Code) { // 找到下一步移动的情况(一步可以为同一块多次移动)
|
|
|
vector <unsigned long long> HRD_group::Find_Next_Case(unsigned long long code) { // 找到下一步移动的情况(一步可以为同一块多次移动)
|
|
|
int num, x, y, i, j; |
|
|
int num, x, y, i, j; |
|
|
bool addr[4][5]; // 在Find_Sub_Case深搜中用于剪枝
|
|
|
bool addr[4][5]; // 在Find_Sub_Case深搜中用于剪枝
|
|
|
bool exclude[4][5]; // 排除已搜索过的块
|
|
|
bool exclude[4][5]; // 排除已搜索过的块
|
|
|
Case_cal dat; |
|
|
Case_cal dat; |
|
|
Parse_Code(dat, Code); |
|
|
Parse_Code(dat, code); |
|
|
for (y = 0; y < 5; y++) { |
|
|
for (y = 0; y < 5; y++) { |
|
|
for (x = 0; x < 4; x++) { |
|
|
for (x = 0; x < 4; x++) { |
|
|
if (dat.status[x][y] == 0xFE) { // 目标格为空
|
|
|
if (dat.status[x][y] == 0xFE) { // 目标格为空
|
|
@ -443,10 +444,10 @@ void HRD_group::Get_Code(Case_cal &dat) { // 获取编码并存储在dat.code |
|
|
dat.code &= 0xFFFFFFFFF; // 清除高28位内容
|
|
|
dat.code &= 0xFFFFFFFFF; // 清除高28位内容
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
bool HRD_group::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组
|
|
|
unsigned char range[16]; // dat低32位分16组
|
|
|
int i, x, y, num, space_num = 0; |
|
|
int i, x, y, num, space_num = 0; |
|
|
dat.code = Code; |
|
|
dat.code = code; |
|
|
for (x = 0; x < 4; x++) { // 初始化status和freeze
|
|
|
for (x = 0; x < 4; x++) { // 初始化status和freeze
|
|
|
for (y = 0; y < 5; y++) { |
|
|
for (y = 0; y < 5; y++) { |
|
|
dat.status[x][y] = 0xFF; |
|
|
dat.status[x][y] = 0xFF; |
|
@ -457,16 +458,16 @@ bool HRD_group::Parse_Code(Case_cal &dat, unsigned long long Code) { // 解析 |
|
|
} |
|
|
} |
|
|
num = 0; |
|
|
num = 0; |
|
|
for (i = 15; i >= 0; i--) { // 载入排列到range
|
|
|
for (i = 15; i >= 0; i--) { // 载入排列到range
|
|
|
range[i] = Code & 0x3; |
|
|
range[i] = code & 0x3; |
|
|
if (range[i] == 0) {num++;} |
|
|
if (range[i] == 0) {num++;} |
|
|
Code >>= 2; |
|
|
code >>= 2; |
|
|
} |
|
|
} |
|
|
if (num < 2) {return false;} // 0的个数低于两个出错
|
|
|
if (num < 2) {return false;} // 0的个数低于两个出错
|
|
|
if (Code > 14) {return false;} // 排除越界情况
|
|
|
if (code > 14) {return false;} // 排除越界情况
|
|
|
if (Code % 4 == 3) {return false;} |
|
|
if (code % 4 == 3) {return false;} |
|
|
dat.type[0] = 0; // 载入2 * 2方块
|
|
|
dat.type[0] = 0; // 载入2 * 2方块
|
|
|
x = Code % 4; |
|
|
x = code % 4; |
|
|
y = Code / 4; |
|
|
y = code / 4; |
|
|
dat.status[x][y] = dat.status[x + 1][y] = dat.status[x][y + 1] = dat.status[x + 1][y + 1] = 0; |
|
|
dat.status[x][y] = dat.status[x + 1][y] = dat.status[x][y + 1] = dat.status[x + 1][y + 1] = 0; |
|
|
num = x = y = 0; |
|
|
num = x = y = 0; |
|
|
for (i = 0; i < 16; i++) { |
|
|
for (i = 0; i < 16; i++) { |
|
|