劍指offer算法題【12】:機器人的運動範圍

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))

運行結果:

發佈了234 篇原創文章 · 獲贊 71 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章