Я пытаюсь решить головоломку из 9 плиток с помощью алгоритма DFS / BFS (давайте сосредоточимся на DFS, поскольку эти два в основном одинаковы), и после некоторой отладки я пришел к выводу, почему мой код не работает.
Я реализую алгоритм, используя стек для границы и набор для закрытого набора, и в какой-то момент я должен проверить, существует ли объект в закрытом наборе. Поэтому, естественно, я использую (temp является объектом из 9 плиток):
if (closed.find(temp) == closed.end()){
\\do stuff
}
Когда я пытался выпустить это выражение, я узнал, что мне пришлось перегрузить операторы '<' и '>, чтобы set.find () мог работать. Таким образом, достигнув моей проблемы, объекты из 9 плиток представляют собой массив целых чисел 2d 3x3 с
значение 0, где пустая плитка. Как я могу определить, является ли, например, одно из следующих состояний моей доски "большим" или "меньшим", чем другое?
6 7 1 3 6 0
0 3 2 2 8 4
4 5 6 5 1 7
Я попытался сравнить каждый элемент с конечным состоянием, которое:
1 2 3
4 5 6
7 8 0
Добавление одного очка для каждой плитки, такой же, как в финале, но это не работает, очевидно, потому что две доски с совершенно неправильно размещенными плитками будут иметь одинаковое количество очков, поэтому я не могу их сравнить.
Я также попытался просмотреть элементы двух досок и составить оценки следующим образом:
bool operator < (const Board &A, const Board &B){
int scoreA=0, scoreB=0;
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
scoreA += i * j * A.getTile(i, j);
scoreB += i * j * B.getTile(i, j);
}
}
return scoreA < scoreB;
}
Однако я не уверен, что это правильно, поскольку я не получаю желаемых результатов.
Можете ли вы предложить лучший метод сравнения двух плат, как этот?