一道演算法題 水流過幾個格仔

2022-05-03 14:21:14 字數 3605 閱讀 4050

一道做智慧型的對話機械人公司的演算法測試題

有乙個矩形的水槽被分為了 n * m 個格仔,每個格仔內的高度都不同,每個格仔和直接相鄰的格仔相通(對角相鄰的不相通)。從最左上角的格仔注入水,水會向相通的較低的或同樣高的格仔流動,但不會流向較高的格仔。請寫程式計算水一共會流經多少個格仔?

例如如果格仔高度如下分布:

3 | 5 | 1

---------

2 | 1 | 5

---------

4 | 2 | 1

則水會從左上角流經 3、2、1 三個格仔,答案為 3。

3 | 5 | 1

---------

2 | 1 | 5

---------

4 | 2 | 1

3

[[0,0]]

3 2

[[0,0],[1,0]]

3 2 1

[[0,0],[1,0],[1,1]]

5 | 5 | 1

---------

2 | 1 | 5

---------

4 | 2 | 1

5

[[0,0]]

5 5 2

[[0,0],[0,1],[1,0]]

↑5 5 2 1 1

[[0,0],[0,1],[1,0],[0,2],[1,1]]

↑5 5 2 1 1

[[0,0],[0,1],[1,0],[0,2],[1,1]] [1,1] 已存在,跳過

↑5 5 2 1 1

[[0,0],[0,1],[1,0],[0,2],[1,1]]

↑5 5 2 1 1

[[0,0],[0,1],[1,0],[0,2],[1,1]]

class solution:

def printgridnumber(self, height_arr):

def judge_contain(key, queue):

for x in queue:

if x == key:

return true

return false

xlen = len(height_arr)

ylen = len(height_arr[0])

if i - 1 >= 0 and height_arr[i - 1][j] <= height_arr[i][j] and not judge_contain([i - 1, j], queue):

if j - 1 >= 0 and height_arr[i][j - 1] <= height_arr[i][j] and not judge_contain([i, j - 1], queue):

if i + 1 < xlen and height_arr[i + 1][j] <= height_arr[i][j] and not judge_contain([i + 1, j], queue):

if j + 1 < ylen and height_arr[i][j + 1] <= height_arr[i][j] and not judge_contain([i, j + 1], queue):

queue = [[0, 0]]

for x in queue:

# print(queue)

return len(queue)

if __name__ == '__main__':

solution = solution()

height_arr = [[3, 2, 1], [3, 2, 1], [2, 3, 1]]

print(solution.printgridnumber(height_arr))

[[3, 5, 1], [2, 1, 5], [4, 2, 1]]  # input

3 # expect value

[[5, 5, 1], [2, 1, 5], [4, 2, 1]]

5[[3, 2, 1], [3, 2, 1], [3, 2, 1]]

9[[3, 2, 1], [3, 2, 1], [2, 3, 1]]

8[[6, 3, 4, 2], [5, 4, 4, 1], [3, 3, 2, 1]]

12

class solution:

def printgridnumber(self, height_arr):

def judge(i, j):

left_top_height = height_arr[0][0]

xlen = len(height_arr)

ylen = len(height_arr[0])

if i - 1 >= 0 and left_top_height >= height_arr[i - 1][j] >= height_arr[i][j]:

return true

if j - 1 >= 0 and left_top_height >= height_arr[i][j - 1] >= height_arr[i][j]:

return true

if i + 1 < xlen and left_top_height >= height_arr[i + 1][j] >= height_arr[i][j]:

return true

if j + 1 < ylen and left_top_height >= height_arr[i][j + 1] >= height_arr[i][j]:

return true

return false

if len(height_arr) == 0:

return

if len(height_arr[0]) == 0:

return

left_top_height = height_arr[0][0]

# print(left_top_height)

number = 1

for i in range(len(height_arr)):

for j in range(len(height_arr[0])):

if i == 0 and j == 0:

continue

if height_arr[i][j] <= left_top_height and judge(i, j):

number += 1

return number

if __name__ == '__main__':

solution = solution()

height_arr = [[3,5,1],[2,1,5],[4,2,1]]

print(solution.printgridnumber(height_arr))

一道演算法題

兩個燒杯,乙個放糖乙個放鹽,用勺子舀一勺糖到鹽,攪拌均勻,然後舀一勺混合 物會放糖的燒杯,問你兩個燒杯哪個雜質多?一樣多吧 對的 為啥?是不是因為 糖和鹽本來就是均勻的 因為,就算不攪拌均,你放一勺過去,那邊放一勺不含雜質的過來,那麼都是一勺雜之 如果攪拌均勻的話也是一樣 小依 21 45 32 也...

一道演算法題

1.上午主要做了對翻譯任務的劃分,下午把 翻譯完畢。2.明天要講的演算法題 對乙個集合,求出其連續元素組成的子集中,和最大的子集 我對這道題的理解是 1 若集合中最小值大於0,意味著所有的都大於0,則最大的子集和,為所有值加起來 2 若集合中最大值小於0,意味著所有的都小於0,則最大的子集和,為集合...

一道演算法題

include using namespace std const int size 5 int max sub array const int a,int n,int m int max matrix const int a size int row,int col,int subsize int...