BFS
思路和八数码一样,对所有状态进行暴力广搜,直到搜到目标状态或者无解为止。也可以利用A*来优化算法。
class Solution {
public:
string ans="123450";
int dx[4]={0,0,-1,1};
int dy[4]={-1,1,0,0};
int slidingPuzzle(vector<vector<int>>& board) {
string s;
unordered_set<string> st;
queue<string> q;
for(auto p:board){
for(auto c:p){
s+='0'+c;
}
}
if(ans==s) return 0;
int len=1;
q.push(s);
st.insert(s);
while(!q.empty()){
int sz=q.size();
while(sz--){
s=q.front();
q.pop();
int pos;
for(int i=0;i<6;i++) if(s[i]=='0') pos=i;
int x=pos/3,y=pos%3;
for(int i=0;i<4;i++){
int xx=x+dx[i],yy=y+dy[i];
if(xx<0||xx>=2||yy<0||yy>=3) continue;
string t=s;
swap(t[x*3+y],t[xx*3+yy]);
if(t==ans) return len;
if(!st.count(t)){
st.insert(t);
q.push(t);
}
}
}
len++;
}
return -1;
}
};
时间复杂为指数级别。