13.機器人的運動範圍

題目描述

地上有一個m行和n列的方格。一個機器人從座標0,0的格子開始移動,每一次只能向左,右,上,下四個方向移動一格,但是不能進入行座標和列座標的數位之和大於k的格子。 例如,當k爲18時,機器人能夠進入方格(35,37),因爲3+5+3+7 = 18。但是,它不能進入方格(35,38),因爲3+5+3+8 = 19。請問該機器人能夠達到多少個格子?

思路:仍舊是回溯法,特別需要注意的是機器人走過一遍的路也不能再走,因此需要設置一個visited記錄那些路走過哪些路沒走過。相當於是尋找機器人能夠走的一條不重複的最大路徑。

這個題是我根據劍指offer上的解法寫的。按照自己的思路不知道爲什麼總是不對,遞歸的時候總是搞不清楚條件判斷的擺放位置。跟前一個題一樣,需要再琢磨琢磨套路。而且特別要注意的是在牛客的編程界面輸入,可能會出現各種缺少冒號呀,拼寫錯誤呀,多了個什麼字符等等等等的情況,窒息了,複製粘貼到IDE裏那些錯誤就一目瞭然了。

Python題解:

# -*- coding:utf-8 -*-
class Solution:
    def movingCount(self, threshold, rows, cols):
        visited=['false']*(rows*cols)
        return self.canMoveIn(threshold,rows,cols,0,0,visited)
    
    def canMoveIn(self,thre,rn,cn,r,c,visited):
        count=0
        if self.check(rn,cn,r,c,thre,visited):
            visited[r*cn+c]='true'
            count=1+self.canMoveIn(thre,rn,cn,r-1,c,visited)+ \
                    self.canMoveIn(thre,rn,cn,r,c-1,visited)+ \
                    self.canMoveIn(thre,rn,cn,r+1,c,visited)+ \
                    self.canMoveIn(thre,rn,cn,r,c+1,visited)
        return count

    def check(self,rows,cols,r,c,threshold,visited):
        if r>=0 and r<rows and c>=0 \
              and c<cols and self.sumNum(r)+self.sumNum(c)<=threshold \
                     and visited[r*cols+c]=='false':
                return True
        return False
    
    def sumNum(self,n):
        sum=0
        while n/10!=0:
            sum=sum+n%10
            n=n/10
        sum=sum+n
        return sum

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章