版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013554860/article/details/88081158
https://leetcode.com/problems/sliding-puzzle/
class Solution {
public:
int slidingPuzzle(vector<vector<int>>& board) {
int res = 0, m = board.size(), n = board[0].size();
string target = "123450", start = "";
vector<vector<int>> dirs{{1, 3}, {0, 2, 4}, {1,5}, {0,4}, {1,3,5},{2,4}}; //各个位置0能达到的位置
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
start += to_string(board[i][j]);
}
}
set<string> visited; //判重
visited.insert(start);
queue<string> Q;
Q.push(start);
while(!Q.empty()){
for(int i=Q.size()-1; i>=0; i--){
string cur = Q.front(); Q.pop();
if(cur==target) return res;
int zero_idx = cur.find('0');
for(int dir: dirs[zero_idx]){
string cand = cur; //当前父节点产生多个子节点
swap(cand[dir], cand[zero_idx]); //变化
if(visited.count(cand)) continue;
visited.insert(cand);
Q.push(cand);
}
}
res += 1;
}
return -1;
}
};