1. 題目
題目:地上有一個m行和n列的方格。一個機器人從座標0,0的格子開始移動,每一次只能向左,右,上,下四個方向移動一格,但是不能進入行座標和列座標的數位之和大於k的格子。 例如,當k爲18時,機器人能夠進入方格(35,37),因爲3+5+3+7 = 18。但是,它不能進入方格(35,38),因爲3+5+3+8 = 19。請問該機器人能夠達到多少個格子?
2. 思路
其實 這道題就是一個回溯法的過程,也可以說是遞歸的過程,每一層迭代 都判斷機器人能往哪些方向走,走到走不動了的時候返回的是一個count,也就是當前這個分支的能夠走到的格子個數。
簡單來說遞歸思路就是:
1. 算出向上走,有多少格子
2. 算出 向下走, 有多少格子
3. 算出 向左走, 有多少格子
4. 算出 向右走, 有多少格子
當然這個過程中會有重複出現的,所以我們 每走一個格子, 就將這個格子 在矩陣中對應的地方設置 成True,每一次 都會判斷一下當前格子是否爲True。
3. 代碼
class Solution:
def movingCount(self, k, rows, cols):
# write code here
markmatrix = [False] * (rows * cols)
count = self.GetNum(k, rows, cols, 0, 0, markmatrix)
return count
def GetNum(self, k, rows, cols, row, col, markmatrix):
count = 0
if self.GetSum(k, rows, cols, row, col, markmatrix):
markmatrix[row * cols + col] = True
count = 1 + self.GetNum(k, rows, cols, row - 1, col, markmatrix) + \
self.GetNum(k, rows, cols, row, col - 1, markmatrix) + \
self.GetNum(k, rows, cols, row + 1, col, markmatrix) + \
self.GetNum(k, rows, cols, row, col + 1, markmatrix)
return count
def GetSum(self, k, rows, cols, row, col, markmatrix):
if row >= 0 and row < rows and col >= 0 and col < cols and self.getDigit(row) + self.getDigit(
col) <= k and not markmatrix[row * cols + col]:
return True
return False
def getDigit(self, number):
sumNum = 0
while number > 0:
sumNum += number % 10
number = number // 10
return sumNum
if __name__ == '__main__':
sys.setrecursionlimit(9000000)
ss = Solution()
print(ss.movingCount(18,40,40))
運行結果: