688. “马”在棋盘上的概率


已知一个 NxN 的国际象棋棋盘,棋盘的行号和列号都是从 0 开始。即最左上角的格子记为 (0, 0),最右下角的记为 (N-1, N-1)。

现有一个 “马”(也译作 “骑士”)位于 (r, c) ,并打算进行 K 次移动。

如下图所示,国际象棋的 “马” 每一步先沿水平或垂直方向移动 2 个格子,然后向与之相垂直的方向再移动 1 个格子,共有 8 个可选的位置。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/knight-probability-in-chessboard
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

import java.util.Arrays;

class Solution {

    private static final int[][] directions = {{2, 1}, {2, -1}, {-2, 1}, {-2, -1},
            {1, 2}, {1, -2}, {-1, 2}, {-1, -2}};

    public double knightProbability(int n, int steps, int row, int column) {
        double[][] dp = new double[n][n];
        dp[row][column] = 1;
        while (steps-- > 0) {
            double[][] helper = new double[n][n];
            for (int i = 0; i < n; ++i) {
                for (int j = 0; j < n; ++j) {
                    for (int k = 0; k < directions.length; ++k) {
                        int x = i + directions[k][0];
                        int y = j + directions[k][1];
                        if (x >= 0 && x < n && y >= 0 && y < n) {
                            helper[x][y] += dp[i][j] / 8.0;
                        }
                    }
                }
            }
            dp = helper;
        }
        double ans = 0;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                ans += dp[i][j];
            }
        }
        return ans;
    }
}

相关