2018-09-09 22:01:02
问题描述:
问题求解:
问题很Interesting,其实本质就是解空间遍历,使用BFS就可以很快的予以解决~
public int slidingPuzzle(int[][] board) {
String goal = "123450";
String start = "";
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
start += (char)(board[i][j] + '0');
}
}
HashSet<String> set = new HashSet<>();
int[][] dirs = new int[][]{{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
set.add(start);
Queue<String> q = new LinkedList<>();
int step = 0;
if (start.equals(goal)) return step;
q.add(start);
while (!q.isEmpty()) {
step++;
int size = q.size();
for (int i = 0; i < size; i++) {
String cur = q.poll();
int idx = cur.indexOf('0');
int row = idx / 3;
int col = idx % 3;
for (int[] dir : dirs) {
int x = row + dir[0];
int y = col + dir[1];
if (x < 0 || x > 1 || y < 0 || y > 2) continue;
int idx2 = x * 3 + y;
StringBuffer sb = new StringBuffer(cur);
sb.setCharAt(idx, sb.charAt(idx2));
sb.setCharAt(idx2, '0');
String t = sb.toString();
if (t.equals(goal)) return step;
if (set.contains(t)) continue;
set.add(t);
q.add(t);
}
}
}
return -1;
}