有乙個xxy的網格,乙個機械人只能走格點且只能向右或向下走,要從左上角走到右下角。請設計乙個演算法,計算機械人有多少種走法。注意這次的網格中有些障礙點是不能走的。
給定乙個intmap(c++ 中為vector >),表示網格圖,若map[i][j]為1則說明該點不是障礙點,否則則為障礙。另外給定intx,inty,表示網格的大小。請返回機械人從(0,0)走到(x - 1,y - 1)的走法數,為了防止溢位,請將結果mod 1000000007。保證x和y均小於等於50
注意此處所用**為python2
# -*- coding:utf-8 -*-
class robot:
def countways(self, m, x, y):
if not m[0][0] or not m[x-1][y-1] :
return 0
if x>50 or y>50 :
return 0
'''dp[i-1][j-1]表示從(0,0)到(i,j)的方法數,如果(i,j)非1,則為障礙點,對應dp[i-1][j-1]為0,其餘情況與一般dp相同
''' dp = [ [0]*y for i in range(x)]#預設為零
dp[0][0] = 1#初始化第乙個格點的走法數
for i in range(1,x) :#生成最左邊也就是到第一列每個格點的走法數,對於左邊沿的格點只能從上邊過來
if m[i][0] == 1 :
dp[i][0] = dp[i-1][0]
for j in range(1,y) :#生成最上邊也就是到第一行每個格點的走法數,對於上邊沿的格點只能從左邊過來
if m[0][j] == 1 :
dp[0][j] = dp[0][j-1]
for i in range(1,x) :#對於非左邊沿、非上邊沿的點,其走法數是其上邊的點與其左邊的點的走法數之和
for j in range(1,y) :
if m[i][j] == 1 :
dp[i][j] = (dp[i-1][j] + dp[i][j-1])%1000000007
return dp[x-1][y-1]
其實有的時候可以舉個例子或畫個圖來幫助理解!
這題還有遞迴的解法,但遞迴相對遞推而言會有拆分的過程,所以比較耗時,之前做題的時候有的題目,寫遞迴會超時,把**改寫為遞推就可以了,所以現在基本上都是使用遞推來做。簡單來說,遞迴好理解,遞推省時間。
機械人走方格II
有乙個xxy的網格,乙個機械人只能走格點且只能向右或向下走,要從左上角走到右下角。請設計乙個演算法,計算機械人有多少種走法。注意這次的網格中有些障礙點是不能走的。給定乙個int map c 中為vector 表示網格圖,若map i j 為1則說明該點不是障礙點,否則則為障礙。另外給定int x,i...
機械人走方格
一 有乙個xxy的網格,乙個機械人只能走格點且只能向右或向下走,要從左上角走到右下角。請設計乙個演算法,計算機械人有多少種走法。給定兩個正整數int x,int y,請返回機械人的走法數目。保證x y小於等於12。思路 共需走x y步,其中有x步向又走,y步向左走,即從x y步中選出x步的種類數,即...
機械人走方格
有乙個x y的網格,乙個機械人只能走格點且只能向右或向下走,要從左上角走到右下角。請設計乙個演算法,計算機械人有多少種走法。給定兩個正整數int x,int y,請返回機械人的走法數目。保證x y小於等於12。這裡採用兩種方法實現。預設是3 3的方格。public class 機械人走方格 遞迴計算...