Skip to content

Commit 0a190f8

Browse files
committed
Time: 13 ms (33.90%), Space: 44.2 MB (41.43%) - LeetHub
1 parent 824869c commit 0a190f8

File tree

1 file changed

+49
-0
lines changed

1 file changed

+49
-0
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
class Solution {
2+
public int slidingPuzzle(int[][] board) {
3+
String target = "123450";
4+
String start = "";
5+
for (int i = 0; i < board.length; i++) {
6+
for (int j = 0; j < board[0].length; j++) {
7+
start += board[i][j];
8+
}
9+
}
10+
HashSet<String> visited = new HashSet<>();
11+
// all the positions 0 can be swapped to
12+
int[][] dirs = new int[][] { { 1, 3 }, { 0, 2, 4 },
13+
{ 1, 5 }, { 0, 4 }, { 1, 3, 5 }, { 2, 4 } };
14+
Queue<String> queue = new LinkedList<>();
15+
queue.offer(start);
16+
visited.add(start);
17+
int res = 0;
18+
while (!queue.isEmpty()) {
19+
// level count, has to use size control here, otherwise not needed
20+
int size = queue.size();
21+
for (int i = 0; i < size; i++) {
22+
String cur = queue.poll();
23+
if (cur.equals(target)) {
24+
return res;
25+
}
26+
int zero = cur.indexOf('0');
27+
// swap if possible
28+
for (int dir : dirs[zero]) {
29+
String next = swap(cur, zero, dir);
30+
if (visited.contains(next)) {
31+
continue;
32+
}
33+
visited.add(next);
34+
queue.offer(next);
35+
36+
}
37+
}
38+
res++;
39+
}
40+
return -1;
41+
}
42+
43+
private String swap(String str, int i, int j) {
44+
StringBuilder sb = new StringBuilder(str);
45+
sb.setCharAt(i, str.charAt(j));
46+
sb.setCharAt(j, str.charAt(i));
47+
return sb.toString();
48+
}
49+
}

0 commit comments

Comments
 (0)