773. 滑动谜题
1 class Solution 2 { 3 public: 4 int slidingPuzzle(vector<vector<int>>& board) 5 { 6 int m = 2, n = 3; 7 string start = ""; 8 string target = "123450"; 9 10 // 将 2x3 的数组转化成字符串 11 for (int i = 0; i < m; i++) 12 { 13 for (int j = 0; j < n; j++) 14 { 15 start.push_back(board[i][j] + '0'); 16 } 17 } 18 19 // 记录一维字符串的相邻索引 20 // 只要可以解开谜板,nerghbor都是一样的 21 vector<vector<int>> neighbor = 22 { 23 { 1, 3 }, 24 { 0, 2, 4 }, 25 { 1, 5 }, 26 { 0, 4 }, 27 { 1, 3, 5 }, 28 { 2, 4 } 29 }; 30 31 /******* BFS 算法框架开始 *******/ 32 queue<string> q; 33 unordered_set<string> visited; 34 q.push(start); 35 visited.insert(start); 36 37 int step = 0; 38 while (!q.empty()) 39 { 40 int sz = q.size(); 41 for (int i = 0; i < sz; i++) 42 { 43 string cur = q.front(); q.pop(); 44 // 判断是否达到目标局面 45 if (target == cur) 46 { 47 return step; 48 } 49 50 // 找到数字 0 的索引 51 int idx = 0; 52 for (; cur[idx] != '0'; idx++); 53 54 // 将数字 0 和相邻的数字交换位置 55 for (int adj : neighbor[idx]) 56 { 57 string new_board = cur; 58 swap(new_board[adj], new_board[idx]); 59 // 防止走回头路 60 if (!visited.count(new_board)) 61 { 62 q.push(new_board); 63 visited.insert(new_board); 64 } 65 } 66 } 67 step++; 68 } 69 return -1; 70 /******* BFS 算法框架结束 *******/ 71 } 72 };
Mamba never out

浙公网安备 33010602011771号