LeetCode 773 滑动谜题[BFS] HERODING的LeetCode之路
Posted HERODING23
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 773 滑动谜题[BFS] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。
解题思路:
这道题目的思路其实与1091题很像,都是从一个状态到另一个状态,如果能到最终状态则返回步数,如果所有状态都遍历了还是没有想要的状态,则返回-1,本题中,由于数组固定,不如换成一组连续的序列“123450”,此外要根据不同0位置所能交换的位置封装成数组(其实本质就是左右上下方向那样)。本题解题过程如下:
- 构建方向数组;
- 构建获取下一状态序列的函数;
- 将初始数组转换成类似“123450”的形式;
- 构建队列,步数,访问数组,并把初始位置放入队列中;
- 对于同一步数的状态,统一进行遍历,判断是否是想要的状态,不是则把状态记录到访问数组中;
- 所有状态都遍历过依然没有想要状态,返回-1。
代码如下:
class Solution {
private:
vector<vector<int>> exchange = {{1, 3}, {0, 2, 4}, {1, 5}, {0, 4}, {1, 3, 5}, {2, 4}};
public:
int slidingPuzzle(vector<vector<int>>& board) {
string init;
for(int i = 0; i < 2; i ++) {
for(int j = 0; j < 3; j ++) {
init += char(board[i][j] + '0');
}
}
if(init == "123450") {
return 0;
}
// 步数,状态队列,访问列表
int step = 0;
queue<string> q;
unordered_set<string> visited = {init};
q.push(init);
while(!q.empty()) {
step ++;
int len = q.size();
// 遍历同一步数的所有状态
for(int i = 0; i < len; i ++) {
string status = q.front();
q.pop();
// 获取所有下一状态
vector<string> res = getStatus(status);
for(auto& next_status : res) {
// 不能是经历过的状态
if(!visited.count(next_status)) {
if(next_status == "123450") {
return step;
}
q.push(next_status);
// move可以改善性能
visited.insert(move(next_status));
}
}
}
}
return -1;
}
// 枚举status一次交换后所能获得的状态
vector<string> getStatus(string& status) {
vector<string> res;
int index = status.find('0');
for(int i : exchange[index]) {
// 换一下
swap(status[index], status[i]);
res.push_back(status);
// 换回来
swap(status[index], status[i]);
}
return res;
}
};
以上是关于LeetCode 773 滑动谜题[BFS] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章