LeetCode:773. 滑动谜题
class Solution {
public:
int slidingPuzzle(vector<vector<int>>& board) {
string target="123450";
string start="";
for(int i=0;i<board.size();i++){
for(int j=0;j<board[0].size();j++){
start=start+to_string(board[i][j]);
}
}
//开始BFS算法
unordered_set<string>visited;
queue<string>q;
//从起点开始搜索
q.push(start);
visited.insert(start);
int step=0;
while(!q.empty()){
int sz=q.size();
for(int i=0;i<sz;i++){
string cur=q.front();
q.pop();
//判断是否达到目标
if(target==cur){
return step;
}
//将数字0和周围数字交换位置
for(string neighborBoard:getNeighbors(cur)){
//防止走回头路
if(!visited.count(neighborBoard)){
q.push(neighborBoard);
visited.insert(neighborBoard);
}
}
}
step++;
}
return -1;
}
vector<string>getNeighbors(string board){
vector<vector<int>>mapping={
{1,3},
{0,4,2},
{1,5},
{0,4},
{3,1,5},
{4,2}
};
int idx=board.find('0');
vector<string>neighbors;
for(int adj:mapping[idx]){
string new_board=swap(board,idx,adj);
neighbors.push_back(new_board);
}
return neighbors;
}
string swap(string board, int i, int j){
char tmp=board[i];
board[i]=board[j];
board[j]=tmp;
return board;
}
};
