問題描述:
題目描述
周末小明準備去爬山鍛煉,0代表平地,山的高度使用1到9來表示,小明每次爬山或下山高度只能相差k及k以內,每次只能上下左右一個方向上移動一格,小明從左上角(0,0)位置出發
輸入描述
第一行輸入m n k(空格分隔),代表m*n的二維山地圖,k為小明每次爬山或下山高度差的最大值。
然后接下來輸入山地圖,一共m行n列,均以空格分隔。取值范圍:0<m≤500,0<n≤500,0<k<5
輸出描述
請問小明能爬到的最高峰多高,到該最高峰的最短步數,輸出以空格分隔。同高度的山峰輸出較短步數。如果沒有可以爬的山峰,則高度和步數都返回0。
備注
所有用例輸入均為正確格式,且在取值范圍內,考生不需要考慮不合法的輸入格式。
5 4 1
0 1 2 0
1 0 0 0
1 0 1 2
1 3 1 0
0 0 0 9
2 2
解題思路:
需要得到小明能爬到的最高峰多高,到該最高峰的最短步數。兩個限制條件,一個最大值、一個最小步數,考慮bfs:
- arr列表,記錄山地圖;vis列表,記錄當前位置是否訪問過;ans列表,記錄高度和步數
- q列表,加入(0,0,0)初始化,遍歷四個方向
- 符合條件:將下一個坐標加入q,并更新下一坐標vis為1,同時將當前高度、步數加入ans列表
- 對ans列表按照高度降序、步數升序排列
代碼實現:
#處理輸入
m,n,k = map(int,input().split())
arr = []
for i in range(m):arr.append(list(map(int,input().split())))
#初始化坐標(0,0)
dir = [(1,0),(-1,0),(0,1),(0,-1)]
vis = [[0]*n for _ in range(m)]
vis[0][0] = 1
ans = []
ans.append((0,0))
q = []
q.append((0,0,0))
#遍歷地圖
while q:(x,y,step) = q.pop()for (i,j) in dir:dx = x+idy = y+jif 0 <= dx < m and 0 <= dy < n and not vis[dx][dy]:if abs(arr[dx][dy] - arr[x][y]) <= k:q.append((dx,dy,step+1))vis[dx][dy] = 1ans.append((arr[dx][dy],step+1))
ans.sort(key = lambda x: (-x[0],x[1]))#默認升序,'-' 代表降序
print(ans[0][0],ans[0][1],sep = ' ')