鱼C论坛

 找回密码
 立即注册
查看: 2402|回复: 0

[技术交流] C++刷LeetCode(773. 滑动谜题)【广度优先搜索】

[复制链接]
发表于 2021-1-15 13:28:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 糖逗 于 2021-1-15 13:29 编辑

题目描述:
  1. 在一个 2 x 3 的板上(board)有 5 块砖瓦,用数字 1~5 来表示, 以及一块空缺用 0 来表示.

  2. 一次移动定义为选择 0 与一个相邻的数字(上下左右)进行交换.

  3. 最终当板 board 的结果是 [[1,2,3],[4,5,0]] 谜板被解开。

  4. 给出一个谜板的初始状态,返回最少可以通过多少次移动解开谜板,如果不能解开谜板,则返回 -1 。

  5. 示例:

  6. 输入:board = [[1,2,3],[4,0,5]]
  7. 输出:1
  8. 解释:交换 0 和 5 ,1 步完成
  9. 输入:board = [[1,2,3],[5,4,0]]
  10. 输出:-1
  11. 解释:没有办法完成谜板
  12. 输入:board = [[4,1,2],[5,0,3]]
  13. 输出:5
  14. 解释:
  15. 最少完成谜板的最少移动次数是 5 ,
  16. 一种移动路径:
  17. 尚未移动: [[4,1,2],[5,0,3]]
  18. 移动 1 次: [[4,1,2],[0,5,3]]
  19. 移动 2 次: [[0,1,2],[4,5,3]]
  20. 移动 3 次: [[1,0,2],[4,5,3]]
  21. 移动 4 次: [[1,2,0],[4,5,3]]
  22. 移动 5 次: [[1,2,3],[4,5,0]]
  23. 输入:board = [[3,2,4],[1,5,0]]
  24. 输出:14
  25. 提示:

  26. board 是一个如上所述的 2 x 3 的数组.
  27. board[i][j] 是一个 [0, 1, 2, 3, 4, 5] 的排列.

  28. 来源:力扣(LeetCode)
  29. 链接:https://leetcode-cn.com/problems/sliding-puzzle
  30. 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
复制代码


  1. class Solution {
  2. public:
  3.     int slidingPuzzle(vector<vector<int>>& board) {
  4.         string start = "";
  5.         int len1 = board.size(), len2 = board[0].size();
  6.         for (int i = 0; i < len1; i++) {
  7.             for (int j = 0; j < len2; j++) {
  8.                 start.push_back(board[i][j] + '0');
  9.             }
  10.         }
  11.         /*
  12.         012
  13.         345         
  14.         */
  15.         string end = "123450";
  16.         vector<vector<int> >neighbors = {
  17.             {1, 3},
  18.             {0, 2, 4},
  19.             {1, 5},
  20.             {0, 4},
  21.             {1, 3, 5},
  22.             {2, 4}
  23.         };
  24.         //广度优先搜索
  25.         queue<string>store;
  26.         set<string>visit;
  27.         store.push(start);
  28.         visit.insert(start);
  29.         int res = 0;
  30.         while(!store.empty()){
  31.             int len = store.size();
  32.             for(int i = 0; i < len; i++){
  33.                 string temp = store.front();
  34.                 store.pop();
  35.                 if(temp == end)return res;
  36.                 //找到当前string中0的位置
  37.                 int index;
  38.                 for(index = 0; index < temp.size(); index++){
  39.                     if(temp[index] == '0')break;
  40.                 }
  41.                 //将当前0与其邻居交换
  42.                 for(auto cha : neighbors[index]){
  43.                     string cur = temp;
  44.                     swap(cur[index], cur[cha]);
  45.                     if(visit.count(cur) == 0){
  46.                         store.push(cur);
  47.                         visit.insert(cur);
  48.                     }
  49.                 }
  50.             }
  51.             res++;
  52.         }
  53.         return -1;
  54.     }
  55. };
复制代码



参考链接:https://leetcode-cn.com/problems ... i-zhi-you-xi-by-la/

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-15 15:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表