leetcode-773. 滑动谜题
思路:bfs穷举所有的状态转移
过程:建立队列、哈希表;将start放入队列;状态转移直到end或者队列为空;step++,结果返回start
class Solution {public:struct state{string s;int i;state()=default;state(string s_,int i_):s{s_},i{i_}{};bool operator==(state s){return this->s==s.s;}};vector<vector<int>> neighbor{{1,3},{0,2,4},{1,5},{0,4},{1,3,5},{2,4}};int slidingPuzzle(vector<vector<int>>& board) {state start;state end{"123450",5};for(int i=0;i<board.size();i++)for(int j=0;j<board[i].size();j++){if(board[i][j]==0) start.i=i*3+j;start.s+=board[i][j]+'0';}unordered_map<string,int> memo;queue<state> q;q.push(start);memo[start.s]=1;int step=0;while(!q.empty()){int size=q.size();for(;size>0;size--){state cur=q.front();if(cur==end) return step;q.pop();cout<<cur.s<<" "<<cur.i<<endl;;for(int i=0;i<neighbor[cur.i].size();i++){state temp=cur;char ch=temp.s[neighbor[temp.i][i]];temp.s[neighbor[temp.i][i]]=temp.s[temp.i];temp.s[temp.i]=ch;temp.i=neighbor[temp.i][i];if(memo.find(temp.s)==memo.end()){q.push(temp);memo[temp.s]=1;}}}step++;}return -1;}
};
leetcode-773. 滑动谜题相关推荐
- Leetcode 773. 滑动谜题 C++
Leetcode 773. 滑动谜题 题目 在一个 2 x 3 的板上(board)有 5 块砖瓦,用数字 1~5 来表示, 以及一块空缺用 0 来表示. 一次移动定义为选择 0 与一个相邻的数字(上 ...
- LeetCode 773. 滑动谜题(BFS 地图状态转换的最短距离)
1. 题目 在一个 2 x 3 的板上(board)有 5 块砖瓦,用数字 1~5 来表示, 以及一块空缺用 0 来表示. 一次移动定义为选择 0 与一个相邻的数字(上下左右)进行交换. 最终当板 b ...
- leetcode 773. 滑动谜题
题目 在一个 2 x 3 的板上(board)有 5 块砖瓦,用数字 1~5 来表示, 以及一块空缺用 0 来表示. 一次移动定义为选择 0 与一个相邻的数字(上下左右)进行交换. 最终当板 boar ...
- 力扣--- 滑动谜题
力扣- 滑动谜题 文章目录 力扣--- 滑动谜题 一.题目描述 二.问题分析 三.代码 一.题目描述 二.问题分析 对于这种计算 最小步数的问题,我们就要敏感地想到 BFS 算法. 这个题目转化成 B ...
- Leetcode双指针滑动窗口相关题目
滑动窗口 滑动窗口解决哪种问题? 滑动窗口解决给定两个字符串S和T,问你S中是否存在一个子串,包含T中的所有字符并且不含有其他字符. 窗口右指针向右移动,窗口增大,直到满足条件,这时候找到可行解. 窗 ...
- LeetCode Hot100 ---- 滑动窗口专题
什么是滑动窗口? 其实就是一个队列,比如题中的 abcabcbb找出其中不含有重复字符的 最长子串 的长度,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满 ...
- LeetCode 480. 滑动窗口中位数(大小堆升级版+set实现)
1. 题目 中位数是有序序列最中间的那个数. 如果序列的大小是偶数,则没有最中间的数:此时中位数是最中间的两个数的平均数. 例如: [2,3,4],中位数是 3 [2,3],中位数是 (2 + 3) ...
- LeetCode 239. 滑动窗口最大值(双端队列+单调栈)
文章目录 1. 题目信息 2. 解题 2.1 暴力法 2.2 双端队列法 1. 题目信息 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内 ...
- LeetCode 239:滑动窗口最大值 思考分析
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. 返回滑动窗口中的最大值. 进阶: 你能在线性 ...
- leetcode 480. 滑动窗口中位数(堆+滑动窗口)
中位数是有序序列最中间的那个数.如果序列的大小是偶数,则没有最中间的数:此时中位数是最中间的两个数的平均数. 例如: [2,3,4],中位数是 3 [2,3],中位数是 (2 + 3) / 2 = 2 ...
最新文章
- centos7 中搭建gitlab
- 怎么样重装系统后能使电脑更快?
- 锁的释放流程-ReentrantLock.tryRelease
- ffmpeg 过程分析
- C#关键字的个人理解与注释
- java swing简介
- 51nod-1065:最小正子段和
- 为什么我们要使用图嵌入?
- 程序员最爱的 10 个在线社区,你去过几个?
- vue-awsome-swiper安装和css引入问题
- 企业邮箱服务器如何设置?
- 漫步微积分二十二——微分方程和分离变量法
- 小小的蜗牛有大大的梦想
- 北京邮电大学计算机学院马华东,马华东(博导)
- java learn 日期
- 要访问1KB的内存为啥需要10位地址线,而不是13位?
- Runtime.availableProcessors()
- Chrom谷歌浏览器配置vue插件
- 安卓性能优化(响应优化)
- python日期工具datedays