豆包 LeetCode 773.滑动迷题 public int slidingPuzzle(int[][] board)
需要我给你讲 每一步是怎么移动、为什么 BFS 一定是最短路径,或者顺便给个 C++/Python 版本 吗?4. 找到target = “123450”就返回当前步数,搜完没找到返回-1。1. 状态压缩:把 2×3 棋盘压成 6 位字符串,方便存进队列和 Set。3. 0 的移动规则:预先写死每个位置能换到哪里( dirs数组)。2. BFS 找最少步数:每一层就是一步。// 每个位置 0 可以
·
这是 LeetCode 773. Sliding Puzzle 标准解法,用 BFS 最短路径,直接可提交的 Java 代码:
java
import java.util.*;
public class Solution {
public int slidingPuzzle(int[][] board) {
// 目标状态
String target = “123450”;
// 每个位置 0 可以交换到的位置
int[][] dirs = {{1, 3}, {0, 2, 4}, {1, 5}, {0, 4}, {1, 3, 5}, {2, 4}};
StringBuilder startSb = new StringBuilder();
for (int[] row : board) {
for (int num : row) {
startSb.append(num);
}
}
String start = startSb.toString();
Queue<String> queue = new LinkedList<>();
Set<String> visited = new HashSet<>();
queue.offer(start);
visited.add(start);
int step = 0;
while (!queue.isEmpty()) {
int size = queue.size();
for (int i = 0; i < size; i++) {
String cur = queue.poll();
if (cur.equals(target)) {
return step;
}
int zero = cur.indexOf('0');
for (int d : dirs[zero]) {
String next = swap(cur, zero, d);
if (!visited.contains(next)) {
visited.add(next);
queue.offer(next);
}
}
}
step++;
}
return -1;
}
private String swap(String s, int i, int j) {
char[] arr = s.toCharArray();
char tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
return new String(arr);
}
}
思路极简说明
1. 状态压缩:把 2×3 棋盘压成 6 位字符串,方便存进队列和 Set。
2. BFS 找最少步数:每一层就是一步。
3. 0 的移动规则:预先写死每个位置能换到哪里( dirs 数组)。
4. 找到 target = “123450” 就返回当前步数,搜完没找到返回 -1 。
需要我给你讲 每一步是怎么移动、为什么 BFS 一定是最短路径,或者顺便给个 C++/Python 版本 吗?
更多推荐




所有评论(0)