]> git.scottworley.com Git - slidingtile/blobdiff - sliding_tile_lib.cc
A distance metric
[slidingtile] / sliding_tile_lib.cc
index 5037c8edbda5877b2ab2d0d2e6ac37d7cd981461..aee8380c421fe11036f4c9bc957cca971edf6eca 100644 (file)
@@ -1,5 +1,6 @@
 #include "sliding_tile_lib.h"
 
+#include <cstdlib>
 #include <istream>
 #include <ostream>
 #include <stdexcept>
@@ -84,3 +85,24 @@ signed char Board::hole() const {
   }
   throw std::runtime_error("Board with no hole");
 }
+
+InvertedBoard Board::invert() const {
+  InvertedBoard inv;
+  for (int i = 0; i < BOARD_SIZE; i++) {
+    inv.pos[board[i]] = i;
+  }
+  return inv;
+}
+
+int Board::distance(const Board& o) const {
+  return distance(o.invert());
+}
+
+int Board::distance(const InvertedBoard& invo) const {
+  int dist = 0;
+  for (int i = 0; i < BOARD_SIZE; i++) {
+    dist += std::abs(i % BOARD_DIM - invo.pos[board[i]] % BOARD_DIM) +
+            std::abs(i / BOARD_DIM - invo.pos[board[i]] / BOARD_DIM);
+  }
+  return dist;
+}