2025年909. 蛇梯棋(图的BFS)

909. 蛇梯棋(图的BFS)文章描述了一个使用广度优先搜索 BFS 算法解决 N N 棋盘上的蛇梯问题 通过计算节点坐标和处理蛇桥规则来遍历所有可能的路径 最终返回到达终点的步数

使用广度优先搜索来遍历从1n*n的可能的路径。

这道题可以看作一个有向图,每个值为x的节点指向x+1点节点,在蛇桥处,是从x指向y

注意这里的xx+1y都是值,可以根据值计算出对应的行列值,计算规则:
假设值为nxt
则对应的r(nxt-1)/n,由于nxt的值是从下往上依次递增,而board的行列值是从上往下递增,因此最终返回的行应该是n-1-(nxt-1)/n
对应的c(nxt-1)%n,由于是s型,所以要根据r的奇偶来区分不同的c值,当r为奇数时,cn-1-(nxt-1)%n,当r为偶数时,c(nxt-1)%n,这里的r(nxt-1)/n,也就是从下往上递增的。

除此之外,还要注意蛇桥位置不计入步数,所以在确定rc后,要判断这里是否存在蛇桥,一步到位,然后再判断一步到位之后的位置和n*n之间的关系。

class Solution {
   
    public int snakesAndLadders(int[][] board) {
   
        int n = board.length;
        boolean[] vis = new boolean[n * n + 1];
        Queue<int[]> q = new LinkedList<>();
        q.offer(new int[] {
   1, 0});
        while (!q.isEmpty()) {
   
            int[] p = q.poll();
            // 扔骰子点数为:1-6
            for (int i = 1; i <= 6; ++i) {
   
                int nxt = p[0] + i;
                if (nxt > n * n) break;
                int[] rc = idx2rc(nxt, n);
                if (board[rc[0]][rc[1]] > 0) nxt = board[rc[0]][rc[1]];
                // 判断是否到终点应该放在判断蛇梯后面,蛇梯不算步数。
                if (nxt == n * n) return p[1] + 1;
                if (!vis[nxt]) {
   
                    vis[nxt] = true;
                    q.offer(new int[] {
   nxt, p[1] + 1});
                }
            }
        }
        return -1;
    }

    private int[] idx2rc(int nxt, int n) {
   
        int r = (nxt - 1) / n;
        int c = r % 2 == 0 ? (nxt - 1) % n : n - 1 - (nxt - 1) % n;
        return new int[] {
   n - 1 - r, c};
    }
}
编程小号
上一篇 2025-03-05 19:11
下一篇 2025-03-20 11:06

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/106872.html