- 分析
求最小步数的问题一般都是使用BFS,但是这道题目是一个二维的2*3的数组,将二维数组放到队列里比较复杂,这个题可以将二维的问题转化成字符串,重点学习neighbor数组的作用。这里它可以把二维的邻居映射成一维的邻居。 - 代码
class Solution {
public:
int slidingPuzzle(vector<vector<int>>& board) {
int m = 2, n = 3;
string start = "";
string target = "123450";
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
start.push_back(board[i][j] + '0');
}
}
vector<vector<int>> neighbor = {
{1, 3}, {0, 4, 2}, {1, 5}, {0, 4}, {3, 1, 5}, {4, 2}
};
queue<string> que;
que.push(start);
unordered_map<string, bool> visited;
visited[start] = true;
int step = 0;
while(!que.empty()){
int size = que.size();
while(size--){
string temp = que.front();
que.pop();
if(temp == target) return step;
int index = 0;
while(temp[index] != '0') index++;
for(int data : neighbor[index]){
string ss = temp;
swap(ss[data], ss[index]);
if(!visited[ss]){
que.push(ss);
visited[ss] = true;
}
}
}
step++;
}
return -1;
}
};