当前位置: 首页 > news >正文

leetcode 773. Sliding Puzzle 滑动谜题 耗时100%

Problem: 773. Sliding Puzzle 滑动谜题

解题过程

耗时100%,用深度优先搜索超时了,而且陷入了无限循环,不太好去重的,不知道怎么做了,看了官方的题解,大概理解了其中的意思,广度优先搜索就好多了,去重方便的,状态用数字表示即可,而且步长是相等的,只要找到题目的状态,就是最短的步长,不需要考虑其他的,广度优先搜索需要拿到下一步的状态

int key = board[0][0] * 100000 + board[0][1] * 10000 + board[0][2] * 1000 + board[1][0] * 100 + board[1][1] * 10 + board[1][2] * 1;

Code

class Solution { public: int dir[4][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} }; int mi = INT_MAX; void dfs(vector<vector<int>>& board, int x, int y, int cnt, unordered_map<int, bool>& ump) { if(cnt > mi) return; int key = board[0][0] * 100000 + board[0][1] * 10000 + board[0][2] * 1000 + board[1][0] * 100 + board[1][1] * 10 + board[1][2] * 1; if(ump[key]==true) return; if(key==123450) { mi = min(mi, cnt); return; } int tmp, xx, yy; ump[key] = true; for(int i = 0; i < 4; i++) { xx = x + dir[i][0]; yy = y + dir[i][1]; if(xx < 0 || yy < 0 || xx >= 2 || yy >= 3) continue; tmp = board[xx][yy]; board[xx][yy] = 0; board[x][y] = tmp; dfs(board, xx, yy, cnt + 1, ump); board[xx][yy] = tmp; board[x][y] = 0; } } int getKey(vector<vector<int>>& board) { int key = board[0][0] * 100000 + board[0][1] * 10000 + board[0][2] * 1000 + board[1][0] * 100 + board[1][1] * 10 + board[1][2] * 1; return key; } int slidingPuzzle(vector<vector<int>>& board) { int i, j, ii = -1, jj = -1, tmp; for(j = 0; j < 3; j++) { if(board[0][j]==0) { ii = 0; jj = j; } } for(j = 2; j >= 0; j--) { if(board[1][j]==0) { ii = 1; jj = j; } } if(getKey(board)==123450) return 0; queue<pair<int, int>> qe; qe.push({getKey(board), 0}); pair<int, int> pr; vector<vector<int>> cpboard = board; int aaa, x, y, xx, yy, kkk; unordered_map<int, bool> ump; while( !qe.empty() ) { pr = qe.front(); cpboard[0][0] = pr.first/100000; aaa = pr.first%100000; cpboard[0][1] = aaa/10000; aaa = aaa%10000; cpboard[0][2] = aaa/1000; aaa = aaa%1000; cpboard[1][0] = aaa/100; aaa = aaa%100; cpboard[1][1] = aaa/10; aaa = aaa%10; cpboard[1][2] = aaa; for(int i = 0; i < 2; i++) { for(int j = 0; j < 3; j++) { if(cpboard[i][j] == 0) { x = i; y = j; break; } } } qe.pop(); if(ump.count(pr.first)!=0) continue; ump[pr.first] = true; for(int i = 0; i < 4; i++) { xx = x + dir[i][0]; yy = y + dir[i][1]; if(xx < 0 || yy < 0 || xx >= 2 || yy >= 3) continue; aaa = cpboard[xx][yy]; cpboard[x][y] = cpboard[xx][yy]; cpboard[xx][yy] = 0; kkk = getKey(cpboard); if(kkk==123450) return pr.second + 1; qe.push({kkk, pr.second + 1}); cpboard[x][y] = 0; cpboard[xx][yy] = aaa; } } // unordered_map<int, bool> ump; // unordered_map<int, bool> umpump; // dfs(board, ii, jj, 0, ump); // if(mi == INT_MAX) return -1; return -1; } };
http://www.gsyq.cn/news/148465.html

相关文章:

  • MonkeyLearn Python客户端:3步实现智能文本分析
  • LuaDec51深度解析:Lua字节码逆向工程实战手册
  • 自然灾害与交通事故无人机检测数据集VOC+YOLO格式372张5类别
  • 102301309陈芳玲的总结
  • 完整教程:Spring中的IOC详解
  • AI聊天居然有17种姿势?提示工程师的武功秘籍大公开
  • 如何使用 Jackknife 估计确保模型稳定性
  • 再见,本地环境!我用这套云原生开发工作流,把上线时间从1天缩短到3分钟。
  • 分压电路深度解析:从基本原理到高级应用的完全指南
  • 七、常微分方程
  • 老牌下载神器,牛批了
  • ModernFlyouts完整教程:3种方法让Windows提示界面焕然一新
  • 2025最新!自考必备8个AI论文工具测评与推荐
  • 九、多元函数微分法及其应用
  • Java增强(二)
  • VR-Reversal终极指南:简单快速实现3D视频转2D免费解决方案
  • 2025最新!10个AI论文软件测评:研究生写论文痛点全解析
  • AI Agent的自然语言生成一致性优化
  • IDEA卡死没反应的全部解决方案
  • 如何有效地使用 Meta 的图像分割模型:SAM 2
  • 如何轻松使用 OCR 和 GPT-4o mini 提取收据信息
  • 2025年中国海洋大学计算机考研复试机试真题(附 AC 代码 + 解题思路)
  • 2025年山东大学计算机考研复试机试真题(附 AC 代码 + 解题思路)
  • 专注RFID读写器,万全智能的20年深耕之路 - 品致汇
  • P8990 [北大集训 2021] 小明的树
  • 基于 YOLOv8 的交通标识与设施识别系统(含完整源码)
  • 你的Git提交记录是“代码史诗”,还是“只有上帝能看懂的天书”?
  • 根据用户标识使用Java 8引入的流(Streams)API进行分组为Map<String, List<TUserAuthorize>>
  • 基于SSM的学科竞赛全流程管理系统的设计与实现
  • 2025年12月优秀工位系统服务商推荐榜:访客系统服务商、访客系统订研发公司、会议预约系统定制、会议预约系统服务商、会议预约系统研发公司 - 优质品牌商家