#27426: 先用廣度延展出去,讓他變成類似點與點之間的問題


811398 (TAIWAN TOP)

學校 : 不指定學校
編號 : 114819
來源 : [123.110.128.125]
最後登入時間 :
2024-11-11 14:44:11
b237. CSAPC'09 迷宮任務 -- 2009海峽兩岸青少年程式設計競賽黃上恩 | From: [223.137.150.92] | 發表日期 : 2021-10-03 23:22

題目要一次測5000個點對點,不可能每次都展開一次,所以要一次完成,剩下只要查詢。
先隨便取一點(1,1),利用往外擴散的方式,找出相對距離,以題目給的例子為例。
distance:
 #  #  #  #  #  #  #  #  #  #
 #  1  2  3  4  5  6  # 12  #
 #  #  #  #  #  6  # 10 11  #
 #  #  #  #  #  7  8  9  #  #
 #  #  # 22  #  8  # 10  #  #
 #  #  # 21  #  9  # 11 12  #
 #  # 21 20 19  # 13 12  #  #
 #  # 22  # 18 17  # 13  #  #
 # 24 23 24  # 16 15 14 15  #
 #  #  #  #  #  #  #  #  #  #

那為了解決如(1,6),(2,5)這種分支的距離,必須在這之間動點手腳
為每個道路命名,如果遇到可以分支的點就換個道路的名字,並記錄下分支點

path:
# # # # # # # # # # # 0 0 0 0 0 1 # 6 # # # # # # 2 # 6 6 # # # # # # 2 3 3 # # # # # 14 # 4 # 5 # # # # # 14 # 4 # 5 7 # # # 13 12 12 # 9 8 # # # # 13 # 12 12 # 10 # # # 16 13 15 # 12 12 10 11 # # # # # # # # # # #

這樣如果要找任兩點距離的話,只要找出分支出兩個點的那個點就可以了,透過加減距離算答案。
而記下道路則是為了避免重複計算距離(用心去感受)

 
ZeroJudge Forum