leetcode688 馬在棋盤上的概率

2021-10-07 09:46:48 字數 1445 閱讀 8755

已知乙個 nxn 的西洋棋棋盤,棋盤的行號和列號都是從 0 開始。即最左上角的格仔記為 (0, 0),最右下角的記為 (n-1, n-1)。

現有乙個 「馬」(也譯作 「騎士」)位於 (r, c) ,並打算進行 k 次移動。

如下圖所示,西洋棋的 「馬」 每一步先沿水平或垂直方向移動 2 個格仔,然後向與之相垂直的方向再移動 1 個格仔,共有 8 個可選的位置。

求移動結束後,「馬」 仍留在棋盤上的概率。

示例:

輸入:3,

2,0,

0輸出:

0.0625

解釋:

輸入的資料依次為 n, k, r, c

第 1 步時,有且只有 2 種走法令 「馬」 可以留在棋盤上(跳到(1

,2)或(2

,1))。對於以上的兩種情況,各自在第2步均有且只有2種走法令 「馬」 仍然留在棋盤上。

所以 「馬」 在結束後仍在棋盤上的概率為 0.0625。

記憶化搜尋或者動態規劃。

三維陣列dp[i][j][k]表示位於位置(i,j),走k步不出界的概率。

當能夠走k+1步時,可以向8個方向分別走一步到達新位置,然後根據新位置上走k步不出界的結果,得到當前位置k+1步不出界的結果(求均值)。

class

solution,,

,,,,

,};public

:double

knightprobability

(int n,

int k,

int r,

int c)

double

step

(int n,

int curx,

int cury, vectordouble

>>

>

& dp,

int curstep)

dp[curx]

[cury]

[curstep]/=

8;return dp[curx]

[cury]

[curstep];}

};

//改寫成動態規劃

class

solution,,

,,,,

,};public

:double

knightprobability

(int n,

int k,

int r,

int c)

dp[i]

[j][k]/=

8;// 提前判斷一下...... 有沒有這個if()都行

if(k == k && i == r && j == c)

return dp[i]

[j][k];}

}}return dp[r]

[c][k];}

};

leetcode 68 文字左右對齊

原理很簡單,但是寫起來比較複雜,首先將不超過maxwidth的字串放入乙個新的陣列result,不要忽略空格所佔空間 對result進行處理,首先去除字串最後面的乙個或多個空格,然後計算去除空格後的字串大小,用過最大大小減去去除空格之後的字串大小,得到d 用除以單詞個數 1 即為原來每個空格位置需要...

LeetCode68 文字左右對齊

給定乙個單詞陣列和乙個長度 maxwidth,重新排版單詞,使其成為每行恰好有 maxwidth 個字元,且左右兩端對齊的文字。你應該使用 貪心演算法 來放置給定的單詞 也就是說,盡可能多地往每行中放置單詞。必要時可用空格 填充,使得每行恰好有 maxwidth 個字元。要求盡可能均勻分配單詞間的空...

LeetCode68文字左右對齊

1.先取出一行能夠容納的單詞,將這些單詞根據規則填入一行 2.計算出額外空格的數量 spacecount,額外空格就是正常書寫用不到的空格 2.1除去所有單詞的長度 3.平均分布 簡單來說就是商和餘數的計算 4.特殊處理 4.1一行只有乙個單詞,單詞左對齊,右側填滿空格 4.2最後一行,所有單詞左對...