<style> html, body, .ui-content { background-image: url(https://truth.bahamut.com.tw/s01/201508/7f0e4bd0e01135c9df434733e0d1544a.JPG); background-color: #333; color: #DDD; } </style> ###### tags: `Meowmeow Online Judge` # Swap Game ## Description You are given a 3 x 3 grid containing the numbers 1, 2, ..., 9. Your task is to perform a sequence of moves so that the grid will look like this: 1 2 3 3 4 5 7 8 9 On each move, you can swap the numbers in any two adjacent squares(horizontally or vertically). What is the minimum number of moves required? ## Input The input has three lines, and each of them has three integers. ## Output Print one integer: the minimum number of moves. ## 解題思路 盤面最多只會有 $9!$ 種可能,所以可以用BFS加上unordered_set來解題 使用string而不是vector是因為unordered_map比較好處理 ## Code ```c++ #include <iostream> #include <set> #include <vector> #include <deque> #include <utility> #include <algorithm> #include <unordered_set> int main() { const std::string target = {"0123456789"}; std::string grid = {"0000000000"}; for (int i = 1; i <= 9; i++) std::cin >> grid[i]; std::deque<std::pair<std::string, int>> dq; // grid and number of moves std::unordered_set<std::string> st; dq.emplace_back(grid, 0); st.insert(grid); while (!dq.empty()) { if (dq.front().first == target) { std::cout << dq.front().second << std::endl; break; } for (int i = 1; i <= 9; i++) { // swap left and right if (i % 3 != 0) { auto new_grid = dq.front().first; std::swap(new_grid[i], new_grid[i + 1]); if (!st.count(new_grid)) { dq.emplace_back(new_grid, dq.front().second + 1); st.insert(new_grid); } } // swap up and down if (i <= 6) { auto new_grid = dq.front().first; std::swap(new_grid[i], new_grid[i + 3]); if (!st.count(new_grid)) { dq.emplace_back(new_grid, dq.front().second + 1); st.insert(new_grid); } } } dq.pop_front(); } if (dq.empty()) std::cout << "No solution" << std::endl; return 0; } ```