688. 骑士在棋盘上的概率

骑士在棋盘上的概率

题目描述:

在一个 n x n 的国际象棋棋盘上,一个骑士从单元格 (row, column) 开始,并尝试进行 k 次移动。行和列是 从 0 开始 的,所以左上单元格是 (0,0) ,右下单元格是 (n - 1, n - 1) 。

象棋骑士有8种可能的走法,如下图所示。每次移动在基本方向上是两个单元格,然后在正交方向上是一个单元格。

每次骑士要移动时,它都会随机从8种可能的移动中选择一种(即使棋子会离开棋盘),然后移动到那里。

骑士继续移动,直到它走了 k 步或离开了棋盘。

返回 骑士在棋盘停止移动后仍留在棋盘上的概率 。

思路:

用动态规划做最省力了,dp[i][j][p] += dp[i-1][x][y]/8,这个位置的概率等于周围8个的概率分别处以8再相加。

代码:

var dirs = []struct{ i, j int }{{-2, -1}, {-2, 1}, {2, -1}, {2, 1}, {-1, -2}, {-1, 2}, {1, -2}, {1, 2}}

func knightProbability(n int, k int, row int, column int) float64 {
    if k == 0{
        return 1
    }
    dp := make([][][]float64, k+1)
    for i:=0;i<=k;i++{
        dp[i] = make([][]float64, n)
        for j:=0; j<n;j++{
            dp[i][j] = make([]float64, n)
            for p:=0; p<n; p++{
                if i == 0{
                    dp[i][j][p] = 1
                }else{
                    for _,v := range dirs{
                        x := j+v.i
                        y := p+v.j
                        if x>=0 && x<n && y>=0 &&y <n{
                            dp[i][j][p] += dp[i-1][x][y]/8
                        }
                    }
                }
            }
        }
    }
    return dp[k][row][column]
}

代码效率:

执行用时:4 ms, 在所有 Go 提交中击败了77.42%的用户
内存消耗:3.6 MB, 在所有 Go 提交中击败了70.97%的用户


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!