騰訊馬拉松之海島小Q

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可以在原地等待潮水漲落到0H之間的任意高度並隨着潮水漲落,而無需消耗體力。爲了簡單起見,假定小Q每次移動可以在一瞬間完成,以至於在移動的過程中海水不會漲落。現在,給定一個起點和一個終點,不限小Q的移動時間,請求出小QAB需要的最少體力。


輸入:

輸入包含多組數據,直到文件結束。對於每一組數據,第一行給出5個整數 N, M, H, S, FNM分別是海島的長和寬,H是潮水的最大高度,S是小Q游泳到相鄰點花費的體力。是步行、上岸、以及下水的固定消耗體力部分。

接下來一行是4個正整數sx,sy,tx,ty,(1< sxtx="N1< syty="M)。(sx,sy)是小Q的起點,(tx,ty)是小Q的終點。接下來N行,每行M個數,用來描述每個點的海拔高度。

每一個輸入的數字都是整數,其中2< NM="1002< FS="1000< 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()


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章