Judge 1 - 航班規劃 === <style> .ui-infobar { display: none; } #hv:hover { cursor: help; } #hv>a:hover { cursor: alias;} </style> #### 檔案名稱: `findFlight.py` ## 故事 :::info 有天,魔法帽老俞的工讀生阿傑覺得老闆太慣(老闆),因此心生不滿決定來一趟說走就走的旅行,決心要氣死老闆。 但是阿傑看了看航班,發覺搞不清楚哪些班次才能讓他抵達目的地,被搞得頭很痛,所以委託各位幫忙寫個程式讓他能夠找到直達或轉機至他想去的地方。 ::: <div id="hv" style="color:white"> 題外話,大家上機考加油,切記遵守<a href="https://hackmd.io/s/rkXzhQ3AX" style="color:white">考場規則</a>,也還有很多次機會可以過的,放輕鬆,別太緊張 : ) </div> ## 題目說明 :::success 給定: - 航班資料 - 起點 - 目標機場 找出所有能從起點抵達目的地的航班路徑與花費時間,若無則不須顯示 :warning: **本次題目至少必須包含 `main` 及 `findPath` 兩個函式並呼叫使用**,本題無時區問題 ::: ## 輸入資料 ### 格式說明 > 轉機所需時間代表從 **前一班飛機** 趕往本班飛機所需耗費的時間。 > > 由於阿傑很厲害,所以**抵達時間加上轉機時間剛好起飛**的話也是可以順利搭到的,例:12:00 抵達 + 30 分鐘轉機時間 = 12:30 起飛的班機也能搭上[color=lightblue] > 所經地點不可重複,重複情況如: A地 -> B 地 -> A地 -> C地 [color=red] ``` 總航班數 起點 終點 航班名稱 起點 終點 起飛時間(日期,時間) 降落時間(日期,時間) 轉機所需時間(分鐘) ``` ### 範例資料 ```shell= 10 TPE BOS AA01 TPE TYO 12/01,10:00 12/01,12:25 10 AB02 TPE HKG 12/01,10:00 12/01,12:00 30 AC03 TPE TSN 12/01,11:15 12/01,12:35 60 BB04 TSN TYO 12/01,18:00 12/01,19:30 45 BC05 SIN TPE 12/01,18:00 12/01,19:30 30 CE50 SIN TYO 12/01,14:00 12/01,16:45 120 RF37 HKG SIN 12/01,12:30 12/01,13:00 30 AQ12 TPE OKA 12/02,00:00 12/02,01:00 30 MM20 SIN NYK 12/01,14:00 12/01,21:00 20 ZH99 NYK BOS 12/01,21:30 12/02,04:20 30 ``` ### 測試資料(請用此區資料測試, 並用 "<" 將txt資料輸入) > 請自行將下述文件儲存成檔案,建議開啟網頁以複製貼上的方式貼至文字檔案中 [color=pink] [inputA.txt](https://moodle.ncnu.edu.tw/pluginfile.php/957935/mod_resource/content/3/inputA.txt) [inputB.txt](https://moodle.ncnu.edu.tw/pluginfile.php/957984/mod_resource/content/4/inputB.txt) [inputC.txt](https://moodle.ncnu.edu.tw/pluginfile.php/957985/mod_resource/content/5/inputC.txt) ## 輸出結果(可順序不同) > 轉機代表自出發換了幾個班機才到達目的地, 若直達目的地則為 0 次 [color=lightblue] > 總行程時間自 **每趟班機起飛** 至 **抵達目的降落時間** 加上 **轉機時間**,意指僅計算在飛機上及轉機的時間,請找出所有的航線及轉機方案 [color=teal] ```shell= 轉機 3 次, 總行程時間為: 1060 分鐘 AB02 -> RF37 -> MM20 -> ZH99 ``` ### 測試資料輸出 ```shell= ## 測試資料一 總共轉機 1 次,總行程時間為: 1062 分鐘 RP43 -> FA13 總共轉機 0 次,總行程時間為: 225 分鐘 WD78 總共轉機 0 次,總行程時間為: 286 分鐘 VX64 ## 測試資料二 總共轉機 0 次,總行程時間為: 431 分鐘 EC79 ## 測試資料三 (無顯示) ``` :::danger 輸出格式必須與範例輸出相同, 但可接受上下順序不同 ::: ## 執行畫面 ![](https://i.imgur.com/ceIPoAW.png) ## HINT > 本區為提示作法,不一定必須使用到 [color=teal] > :warning: 僅 CMD 使用範例,無法直接複製貼上使用 ### Datetime (時間日期型態) > [官方文件 - Datetime](https://docs.python.org/3/library/datetime.html#module-datetime) ```python= from datetime import datetime ### 建立時間型態 datetime(年, 月, 日, 時, 分, 秒) newtime = datetime(2018, 11, 23, 16, 25, 30) anothertime = datetime(2018, 11, 23, 18, 25, 30) # newtime 為 datetime.datetime(2018, 11, 23, 16, 25, 30) # anothertime 為 datetime.datetime(2018, 11, 23, 18, 25, 30) ### 時間比較 newtime > anothertime # False newtime < anothertime # True ### 格式化讀取的方法 # datetime.strptime(傳入值, 傳入格式) datetime.strptime('2015-6-1 18:19:59', '%Y-%m-%d %H:%M:%S') # datetime.datetime(2015, 6, 1, 18, 19, 59) # 可以不用每個數值都讀入 datetime.strptime('6/1@18:19', '%m/%d@%H:%M') # datetime.datetime(1900, 6, 1, 18, 19) ``` ### Timedelta (時間計算型態) > [官方文件 - Timedelta](https://docs.python.org/3/library/datetime.html#timedelta-objects) ```python= from datetime import timedelta # datetime 計算時需要使用 timedelta 物件 newtime = datetime(2018, 11, 23, 16, 25, 30) # datetime.datetime(2018, 11, 23, 16, 25, 30) # newtime - 60分鐘 newtime - timedelta(minutes=60) # datetime.datetime(2018, 11, 23, 15, 25, 30) ``` ## 無關緊要的資訊 [全球機場代碼清單](http://www.ting.com.tw/tour-info/air-name.htm)