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