这是 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 版本 吗?

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐