地上有乙個m行和n列的方格。乙個機械人從座標0,0的格仔開始移動,每一次只能向左,右,上,下四個方向移動一格,但是不能進入行座標和列座標的數字之和大於k的格仔。 例如,當k為18時,機械人能夠進入方格(35,37),因為3+5+3+7 = 18。但是,它不能進入方格(35,38),因為3+5+3+8 = 19。請問該機械人能夠達到多少個格仔?
一開始沒注意到機械人一次只移動一格,所以寫的**是計算所有格內滿足行列座標數字之和小於等於k的格仔數,算是更厲害一些吧,哈哈!
# -*- coding:utf-8 -*-
class
solution:
defmovingcount
(self, threshold, rows, cols):
# write code here
if threshold == 0:
return
0 index = {}
for i in range(rows):
cnt = self.cnt(i)
if cnt <= threshold:
if cnt in index:
index[cnt] += 1
else:
index[cnt] = 1
else:#去掉就是算除去一次一步條件下機械人可達的格仔數
break
#去掉就是算除去一次一步條件下機械人可達的格仔數
res = 0
for i in range(cols):
cnt = self.cnt(i)
if threshold - cnt >= 0:
for j in index:
if j + cnt <= threshold:
res += index[j]
else:#去掉就是算除去一次一步條件下機械人可達的格仔數
break;#去掉就是算除去一次一步條件下機械人可達的格仔數
return res
defcnt(self, num):
res = num % 10
num /= 10
while num:
res += num % 10
num /= 10
return res
該演算法的設計思路恰巧就是因為我沒注意到一次只能走一步的條件,所以想到了這樣的用例:
k = 7, row = 15, col = 13
,當col = 0時,row允許的值是0-7
,10-14
。注意到了嗎,中間是會斷開的!10-14
區間段也被允許是因為它們位數和加起來後相當於1-5
!這樣的話,其實可以在算到1-5
時就每格多算一格,因為10-14
這裡也會重複。所以我就想到了將index當成係數表示該行可以算作幾格,這樣就不用把所有的行都算一遍了。
事實上,col也可以進行相同的處理,我去更改下**好了。
# -*- coding:utf-8 -*-
class
solution:
defmovingcount
(self, threshold, rows, cols):
# write code here
if threshold == 0:
return
0 row = self.calindex(rows, threshold)
col = self.calindex(cols, threshold)
res = 0
for i in range(len(col)):
minus = threshold - i
if minus >= 0:
for j in row[:minus + 1]:
res += j * col[i]
return res
defcalindex
(self, line, threshold):
index = [0] * line
for i in range(line):
cnt = self.cnt(i)
if cnt <= threshold:
index[cnt] += 1
else:#去掉就是算除去一次一步條件下機械人可達的格仔數
break
#去掉就是算除去一次一步條件下機械人可達的格仔數
return index
defcnt(self, num):
res = num % 10
num /= 10
while num:
res += num % 10
num /= 10
return res
這下就更加精簡了,總的思想就是行列都算出來每一格等同於多少格,然後相乘即可,好好體會下吧,自己畫個圖應該就明白了。 牛客 機械人的運動範圍
題目描述 地上有乙個m行和n列的方格。乙個機械人從座標0,0的格仔開始移動,每一次只能向左,右,上,下四個方向移動一格,但是不能進入行座標和列座標的數字之和大於k的格仔。例如,當k為18時,機械人能夠進入方格 35,37 因為3 5 3 7 18。但是,它不能進入方格 35,38 因為3 5 3 8...
機械人運動範圍
題目 地上有乙個m行和n列的方格。乙個機械人從座標0,0的格仔開始移動,每一次只能向左,右,上,下四個方向移動一格,但是不能進入行座標和列座標的數字之和大於k的格仔。例如,當k為18時,機械人能夠進入方格 35,37 因為3 5 3 7 18。但是,它不能進入方格 35,38 因為3 5 3 8 1...
機械人運動範圍
地上有乙個m行和n列的方格。乙個機械人從座標0,0的格仔開始移動,每一次只能向左,右,上,下四個方向移動一格,但是不能進入行座標和列座標的數字之和大於k的格仔。例如,當k為18時,機械人能夠進入方格 35,37 因為3 5 3 7 18。但是,它不能進入方格 35,38 因為3 5 3 8 19。請...