ボード上のJava実装LeetCode 688「馬」確率(DFS +メモリ検索)

ボード上の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;
	}
}
リリース1738元の記事 ウォンの賞賛30000 + ビュー366万+

おすすめ

転載: blog.csdn.net/a1439775520/article/details/105329006