https://leetcode.com/problems/sliding-puzzle/description/
又一道简单的hard题、、、
唯一的trick就是用String保存棋盘状态
struct Node {
string s;
int v;
Node(string s, int v): s(s),v(v){}
};
class Solution {
public:
int zidx(string s) {
for (int i = 0; i < s.size(); i++) {
if (s[i] == '0') return i;
}
return -1;
}
int slidingPuzzle(vector<vector<int>>& board) {
unordered_set<string> visit;
queue<Node> q;
string init = "", end = "123450";
for (int i = 0; i < board.size(); i++) {
for (int j = 0; j < board[0].size(); j++) {
init = init + (char)(board[i][j] + '0');
}
}
q.push( Node(init, 0) );
while (!q.empty()) {
Node tp = q.front();
q.pop();
if (tp.s == end) return tp.v;
// cout << tp.s << "->" << tp.v << endl;
int idx = zidx(tp.s);
string tmp = tp.s;
if (idx%3 < 2 ) { // right
tmp = tp.s;
swap(tmp[idx], tmp[idx+1]);
if (visit.find(tmp) == visit.end()) {
visit.insert( tmp );
q.push( Node(tmp, tp.v + 1) );
}
}
if (idx % 3 != 0) { // left
tmp = tp.s;
swap(tmp[idx], tmp[idx-1]);
if (visit.find(tmp) == visit.end()) {
visit.insert( tmp );
q.push( Node(tmp, tp.v + 1) );
}
}
if (idx < 3) { // down
tmp = tp.s;
swap(tmp[idx], tmp[idx+3]);
if (visit.find(tmp) == visit.end()) {
visit.insert( tmp );
q.push( Node(tmp, tp.v + 1) );
}
}
if (idx >= 3) { // down
tmp = tp.s;
swap(tmp[idx], tmp[idx-3]);
if (visit.find(tmp) == visit.end()) {
visit.insert( tmp );
q.push( Node(tmp, tp.v + 1) );
}
}
}
return -1;
}
};