百度2018春招 演算法工程師筆試題--程式設計題2--爬山
阿新 • • 發佈:2019-01-24
這次百度演算法工程師筆試題中的兩個程式設計題目,第一個是排列組合問題,很鬧心,耗費了不少時間,搞得第二道也沒做完,平時還是要多練習呀。
題目: 爬山
內容:冬木市西邊的園藏山是著名的旅遊勝地。從空中俯瞰,園藏山可以看成一個n*m的矩陣,我們把行從上往下按1到n編號,把列從左到右按1到m編號,那麼(i,j)就表示矩陣的第i行第j列的位置。我們用 hij, 表示位置(i,j)的海拔高度。
初始時,Saber在(sx, sy)這個位置, 她想前往更高的地方,每一次她可以選擇向上、下、左、右其中一個方向走,但不能走出這個矩陣;同時,作為大不列顛的王,孤傲的Saber不願意走到比她當前所在的位置海拔要低的位置,也就是說在移動的過程中,每一步她都只能向海拔不低於她當前所在的位置的那些位置移動。請你幫忙計算出她所能走到的最高高度。
Python 3 實現,
class Solution: # 回溯法, 用棧來實現 def findMax(self, n, m, ns, ms, maps): st = [[ns, ms, -1]] # 開闢一個棧,並把初始化第一個值 cur_max = maps[ns][ms] # 當前最大值 path = [[1] * m for _ in range(n)] # 1 為可以走,0 為已經走過 path[ns][ms] = 0 # 標記第一個開始位置已經走過 while st: # 如果不為空 i, j, di, find = st[-1][0], st[-1][1], st[-1][2], 0 i1, j1 = -1, -1 # 記錄下一步可走的座標 while (di < 4 and find == 0): di += 1 if di == 0: i1, j1 = i - 1, j # 向上走 elif di == 1: i1, j1 = i, j + 1 # 向右走 elif di == 2: i1, j1 = i + 1, j # 向下走 elif di == 3: i1, j1 = i, j - 1 # 向左走 if (i1 >= 0 and i1 < n) and (j1 >= 0 and j1 < m) and (path[i1][j1] == 1) and (maps[i1][j1] >= cur_max): find = 1 if find == 1: st[-1][2] = di # 當前棧頂的一個方向 進入下一個可走的方格 st.append([i1, j1, -1]) # 入棧 cur_max = maps[i1][j1] # 更新最大值 path[i1][j1] = 0 # 已經走過了 else: path[st[-1][0]][st[-1][1]] = 1 # 恢復可走的方格 st.pop() # 出棧 return cur_max if __name__ == '__main__': n, m = map(int, input().split()) # 輸入矩陣的維度 ns, ms = map(int, input().split()) ns, ms = ns - 1, ms - 1 # 輸入開始位置 maps = [] # 輸入矩陣 for case in range(n): tmp = list(map(int, input().split())) maps.append(tmp) # n, m = 4, 4 # 測試用例 # ns, ms = 2, 0 # maps = [[1, 1, 1, 2], # [1, 2, 4, 3], # [4, 2, 6, 6], # [5, 1, 12, 10]] solu = Solution() print(solu.findMax(n, m, ns, ms, maps))
發現問題,可以留言交流哦。小白一個。