小Q漂流到了一座海島上。這座海島可以看作是一個矩形,劃分爲N*M個小格子,每個格子用(x,y)來表示,對應的海拔高度爲h(x,y)。此外,海水會隨着時間漲潮落潮,從海拔高度0漲到H,再落潮,高度回落至0,如此反覆。當某個點的海拔高度小於潮水時,會從陸地變成海洋(不考慮該點是否被其他陸地包圍),反之也會由海洋變爲陸地。
現在,小Q想要從海島上的A地走到B地。走的時候只能從當前格子走到其相鄰(上下左右)四個格子之一,且花費一定的體力x:
1.步行(從陸地到陸地):x爲兩塊陸地的高度差dH加上固定消耗F。
2.游泳(從海洋到海洋):x爲固定的S。
3.上岸或下水(從海洋或陸地到另一種地形):x爲陸地高出海水的差dH加上固定消耗 F。
小Q可以在原地等待潮水漲落到0到H之間的任意高度並隨着潮水漲落,而無需消耗體力。爲了簡單起見,假定小Q每次移動可以在一瞬間完成,以至於在移動的過程中海水不會漲落。現在,給定一個起點和一個終點,不限小Q的移動時間,請求出小Q從A到B需要的最少體力。
輸入:
輸入包含多組數據,直到文件結束。對於每一組數據,第一行給出5個整數 N, M, H, S, F。N和M分別是海島的長和寬,H是潮水的最大高度,S是小Q游泳到相鄰點花費的體力。F 是步行、上岸、以及下水的固定消耗體力部分。
接下來一行是4個正整數sx,sy,tx,ty,(1< sxtx="N,1< syty="M)。(sx,sy)是小Q的起點,(tx,ty)是小Q的終點。接下來N行,每行M個數,用來描述每個點的海拔高度。
每一個輸入的數字都是整數,其中2< NM="100,2< FS="100,0< H hxy="1000。
輸出:
對於每組數據輸出一行,輸出小Q從起點到終點所需要的最小體力。
樣例輸入:
3 5 6 3 1
1 1 3 3
5 6 7 8 9
5 6 7 8 9
5 6 7 8 9
3 5 5 3 1
1 1 3 3
5 6 7 8 9
5 6 7 8 9
5 6 7 8 9
3 5 20 3 2
1 1 3 5
10 10 3 10 10
10 10 3 10 10
10 10 3 10 10
樣例輸出:
5
6
12
# -*- encoding:UTF-8 -*-
data_file=open("c:/data.txt",'r')
N,M,H,S,F=[int(i) for i in data_file.readline().strip('\n').split(' ')]
print N,M,H,S,F
island=[]
paths=[]
#都讀一組數據
def read_file():
l =data_file.readline()
if len(l) >=4:
x1,y1,x2,y2=[int(i) for i in l.strip('\n').split(' ')]
for i in range(int(N)):
island.append([int(i) for i in data_file.readline().strip('\n').split(' ')])
return x1,y1,x2,y2
return (-1,-1,-1,-1)
#x,y的高度
def h(x,y):
return island[x-1][y-1]
#找到島上的最高點
def highest(island):
h_max = 0
for i in island:
for j in i:
if j > h_max:
h_max = j
#輸出從()到()的所有路徑
def pailie(x0,y0,x,y,res=[]):
res.append((x0,y0))
if x0 == x and y0 == y:
paths.append(res)
return
if x0 < x and y0 < y:
pailie(x0+1,y0,x,y,res[:])
pailie(x0,y0+1,x,y,res[:])
if x0 ==x and y0 < y:
pailie(x0,y0+1,x,y,res)
if x0 < x and y0 == y:
pailie(x0+1,y0,x,y,res)
#計算每條路徑的能力消耗
def cal_each_path(l):
cost=0
for i in range(len(l)-1):
x0,y0=l[i]
x1,y1=l[i+1]
high_distance=abs(h(x0,y0)-h(x1,y1))
cost += high + F
return cost
def chose_one_path(path):
least_digest=9999
for i in path:
eng = cal_each_path(i)
if eng < least_digest:
least_digest = eng
return least_digest
#根據所給出的能量消耗,walk,swim等,作出選擇,輸出
def chose(x1,y1,x2,y2):
start = h(x1,y1)
end = h(x2,y2)
#走路的消耗
walk_exp = chose_one_path(paths)
swim_exp = 0
if H >= start and H >= end:
swim_exp = S
if start > H and end < H:
swim_exp = start - H + F + S
if end > H and start < H:
swim_exp = end - H + F + S
if start > H and end > H:
swim_exp = start - H + end - H + F + F + S
if walk_exp < swim_exp:
print walk_exp
else:
print swim_exp
def run():
while(data_file):
x1,y1,x2,y2 = read_file()
if x1 == -1:
return
else:
print x1,y1,x2,y2
for i in island:
print i
chose(x1,y1,x2,y2)
while len(island)>0:
island.pop()
if __name__ == "__main__":
run()