思路: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;
}
};