ボード上の688「馬」確率
N×Nのチェスボード所与、チェスボードの行番号と列番号は、ゼロベースです。すなわち、(0、0)のようなグリッドの左上隅、右下隅は(N-1、N-1)と呼ばれます。
既存の(R、C)に位置(また、「ナイト」として翻訳)「馬」、K倍と移動する予定。
、各ステップでチェス「MA」は、図中水平方向または垂直方向の下方に移動する。2格子を、格子は、次にそれに直交する方向、8つの任意の位置の合計に再び移動されます。
スキップが基板外に移動されるまで、今や「MA」(外部基板を含む)の任意の位置からのすべてのステップは、独立して、ランダムに一つ選択、又はK回動かします。
、確率のボード上の「馬」遺骨を求める動きが完了した後。
例:
入力:3、2、0、0
出力:0.0625
解釈:
データ入力が連続N、K、R、Cであり、
第一段階の間、および2つだけの法「MA」ボード上に残ることができる上に(ジャンプ( 1,2)または(2,1))。以上の2例については、それぞれのステップ2にあったし、徒歩2種類の法「馬」はボード上に残りました。
したがって、確率は後に「馬」は0.0625のボードにはまだです。
注意:
Nレンジ[1、25]
Kは、範囲[0、100]にある
先頭に、「馬」常に基板上に配置されています
class Solution {
int[][] move = { { 1, 2 }, { 1, -2 }, { 2, 1 }, { 2, -1 }, { -1, 2 }, { -1, -2 }, { -2, 1 }, { -2, -1 } };
double[][][] dp;
public double knightProbability(int N, int K, int r, int c) {
dp = new double[N][N][K + 1];
if (K == 0)
return 1;
return dfs(N, K, r, c);
}
private double dfs(int N, int K, int r, int c) {
if (dp[r][c][K] != 0)
return dp[r][c][K];
double res = 0;
for (int i = 0; i < 8; i++) {
int r1 = r + move[i][0];
int c1 = c + move[i][1];
if (r1 >= 0 && r1 < N && c1 >= 0 && c1 < N) {
res += (K == 1 ? 1 : dfs(N, K - 1, r1, c1));
}
}
return dp[r][c][K] = res / 8;
}
}