-
-
Save salamantos/6b651f5982cc2dc5435811e19abb0f50 to your computer and use it in GitHub Desktop.
heuristic
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
int inline heuristic( vector<int>& boardVector ) | |
{ | |
// Manhattan distance | |
int res = 0; | |
for (size_t i = 0; i < 16; i++) { | |
if (boardVector[i] != 0) { | |
res += abs( x[boardVector[i]] - maskX[i] ); | |
res += abs( y[boardVector[i]] - maskY[i] ); | |
} | |
} | |
// Linear conflict | |
// Перебираем строки | |
for (int i = 0; i < 4; ++i) { | |
// Перебираем первые 3 элемента в строке | |
for (int j = 0; j < 3; ++j) { | |
// Если элемент в решенном состоянии должен быть в этой строке | |
int tile1 = boardVector[4 * i + j]; | |
if(tile1==0) continue; | |
if (tile1 >= 4*i + 1 && tile1 <= 4*i + 4) { | |
// Перебираем элементы правее него | |
for (int k = j + 1; k < 4; ++k) { | |
int tile2 = boardVector[4 * i + k];if(tile2==0) continue; | |
if (tile2 >= 4 * i + 1 && tile2 <= 4 * i + 4 && tile2 < tile1) { | |
res += 2; | |
} | |
} | |
} | |
} | |
} | |
// Перебираем столбцы | |
for (int i = 0; i < 4; ++i) { | |
// Перебираем первые 3 элемента в столбце | |
for (int j = 0; j < 3; ++j) { | |
// Если элемент в решенном состоянии должен быть в этом столбце | |
int tile1 = boardVector[4 * j + i];if(tile1==0) continue; | |
if ((tile1 - 1) % 4 == i) { | |
// Перебираем элементы ниже него | |
for (int k = j + 1; k < 4; ++k) { | |
int tile2 = boardVector[4 * k + i];if(tile2==0) continue; | |
if ((tile2 - 1) % 4 == i && tile2 < tile1) { | |
res += 2; | |
} | |
} | |
} | |
} | |
} | |
//int ret = 0; | |
//// строка | |
//int row[] = { 3, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3 }; | |
//// столбец | |
//int column[] = { 3, 0 ,1 ,2, 3, 0 ,1 ,2, 3, 0 ,1 ,2, 3, 0 ,1 ,2 }; | |
//// строки | |
//for (int i = 0; i < 4; i++) | |
// for (int j = 0; j < 4; j++) { | |
// int currNum = posTable[i][j]; | |
// for (int k = j + 1; k < 4; k++) { | |
// if (row[posTable[i][k]] == row[posTable[i][j]] && column[posTable[i][k]] < column[posTable[i][j]]) | |
// ret += 2; | |
// } | |
// } | |
//// столбца | |
//for (int j = 0; j < 4; j++) | |
// for (int i = 0; i < 4; i++) { | |
// int currNum = posTable[i][j]; | |
// for (int k = i + 1; k < 4; k++) { | |
// if (column[posTable[k][j]] == column[posTable[i][j]] && row[posTable[k][j]] < row[posTable[i][j]]) | |
// ret += 2; | |
// } | |
// } | |
//return ret; | |
return res; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
int inline heuristic( vector<int>& boardVector ) | |
{ | |
// Manhattan distance | |
int res = 0; | |
for (size_t i = 0; i < 16; i++) { | |
if (boardVector[i] != 0) { | |
res += abs( x[boardVector[i]] - maskX[i] ); | |
res += abs( y[boardVector[i]] - maskY[i] ); | |
} | |
} | |
// Linear conflict | |
// Перебираем строки | |
for (int i = 0; i < 4; ++i) { | |
// Перебираем первые 3 элемента в строке | |
for (int j = 0; j < 3; ++j) { | |
// Если элемент в решенном состоянии должен быть в этой строке | |
int tile1 = boardVector[4 * i + j]; | |
if (tile1 >= 4 * i + 1 && tile1 <= 4 * i + 4) { | |
// Перебираем элементы правее него | |
for (int k = j + 1; k < 4; ++k) { | |
int tile2 = boardVector[4 * i + k]; | |
if (tile2 >= 4 * i + 1 && tile2 <= 4 * i + 4 && tile2 < tile1) { | |
res += 2; | |
} | |
} | |
} | |
} | |
} | |
// Перебираем столбцы | |
for (int i = 0; i < 4; ++i) { | |
// Перебираем первые 3 элемента в столбце | |
for (int j = 0; j < 3; ++j) { | |
// Если элемент в решенном состоянии должен быть в этом столбце | |
int tile1 = boardVector[4 * j + i]; | |
if ((tile1 - 1) % 4 == i) { | |
// Перебираем элементы ниже него | |
for (int k = j + 1; k < 4; ++k) { | |
int tile2 = boardVector[4 * k + i]; | |
if ((tile2 - 1) % 4 == i && tile2 < tile1) { | |
res += 2; | |
} | |
} | |
} | |
} | |
} | |
return res; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment