Skip to content

Instantly share code, notes, and snippets.

@salamantos
Created March 26, 2018 12:24
Show Gist options
  • Save salamantos/6b651f5982cc2dc5435811e19abb0f50 to your computer and use it in GitHub Desktop.
Save salamantos/6b651f5982cc2dc5435811e19abb0f50 to your computer and use it in GitHub Desktop.
heuristic
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;
}
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