909. 蛇梯棋(图的BFS)

使用广度优先搜索来遍历从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};
    }
}
  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值