X-Git-Url: http://git.scottworley.com/slidingtile/blobdiff_plain/9c32325fbc48baf135d0d7840e99ded70cb738f5..d50a762626723f94b364f4a79232b89b96e63585:/sliding_tile_lib.cc diff --git a/sliding_tile_lib.cc b/sliding_tile_lib.cc index aee8380..82402a5 100644 --- a/sliding_tile_lib.cc +++ b/sliding_tile_lib.cc @@ -2,10 +2,12 @@ #include #include +#include #include #include +#include -signed char adjacent[BOARD_SIZE][5] = { +signed char Step::adjacent[BOARD_SIZE][5] = { 1, 4, -1, -1, -1, 0, 2, 5, -1, -1, 1, 3, 6, -1, -1, @@ -106,3 +108,31 @@ int Board::distance(const InvertedBoard& invo) const { } return dist; } + +std::vector Step::successors(std::shared_ptr shared_this) { + std::vector suc; + signed char hole_pos = board.hole(); + for (int i = 0; adjacent[hole_pos][i] > 0; i++) { + suc.emplace_back(new Step{board, shared_this}); + std::swap(suc.back()->board.board[hole_pos], suc.back()->board.board[adjacent[hole_pos][i]]); + } + return suc; +} + +std::ostream& operator<<(std::ostream& os, const Step& step) { + if (step.prev != nullptr) { + os << *step.prev; + signed char this_hole = step.board.hole(); + signed char prev_hole = step.prev->board.hole(); + os << int(step.board.board[prev_hole]) << " "; + switch (this_hole - prev_hole) { + case -1: os << "right"; break; + case 1: os << "left"; break; + case -BOARD_DIM: os << "down"; break; + case BOARD_DIM: os << "up"; break; + default: os << "somehow!"; break; + } + os << std::endl; + } + return os; +}