#45376: 解題思路與題解


harrisyu9696@gmail.com (harrisyu9696)

學校 : 國立臺灣師範大學附屬高級中學
編號 : 196611
來源 : [140.112.16.183]
最後登入時間 :
2025-01-23 16:04:40
c148. 機器人障礙賽 | From: [118.167.129.206] | 發表日期 : 2025-02-22 00:23

提示(可以先想想怎麼做再看題解)

觀察走法:機器人在地圖上只能往左、下、右走,而且不能回頭(走過的列會被封鎖),你能從起點往下走到終點的路徑上,哪些方向的選擇會讓轉彎次數增加?
狀態定義:想一想,每一步你除了記錄位置外,還需要記錄「目前行走的方向」才能知道下一步是否需要轉彎。那如何把「轉彎次數」納入搜尋中?
最短路徑搜尋:如果移動時「直走」的動作不會增加轉彎數,而「轉彎」會增加 1 次,那有沒有一種搜尋方法可以根據 0 或 1 的權重,快速找到轉彎最少的路徑?
注意題目中關於轉彎的限制
初始狀態固定朝向下。
當機器人從直走狀態轉彎時,根據當前方向不同,能轉向的方向也不同(例如:當朝下時可以轉向左右,而水平方向只能轉下)。

 

 

題解

問題的轉換:

紀錄網格:將地圖看作一個 n*m 的二維陣列,每個位置可能是空格(可走)或障礙物(不可走)。
狀態表示:為了知道接下來走路是否需要轉彎,我們除了記錄當前位置 (r, c) 外,還需要記錄機器人的「行走方向」。這裡我們定義三種方向:
0:左、1:下、2:右

搜尋方法的選擇:

因為「直走」的動作不會增加轉彎數(成本 0),而轉彎會增加 1(成本 1),這讓問題可以用 0-1 BFS 解決,是一種針對邊權重僅為 0 或 1 的最短路徑搜尋方法,可以用 deque 實作。(有興趣可以研究這個技巧,某些時刻可以簡化問題)

初始化與狀態轉移:

初始狀態:機器人起點位於 (0, b),並且根據題目 n=1 時會面向牆壁的特別規則,但本題中起始方向固定設為「下」(方向 1)。
狀態轉移:
直走:若機器人保持同一方向前進一格,則轉彎數不增加,這樣的動作我們可以放到 deque 的前端(成本為 0)。
轉彎:根據目前方向轉向另一個方向(依題目規則,從 down 可轉向左右,從 left/right 只能轉向下),則轉彎數增加 1,此時將狀態放入 deque 的後端(成本為 1)。
為了避免重複走到,使用三維陣列 cost[r][c][d] 紀錄從起點到達 (r, c) 且方向為 d 時的最小轉彎數。

邊界與障礙判斷:

每次移動前都必須檢查目標位置是否在網格範圍內,且是否不是障礙物。
當移動至某一個新位置時,如果已知的轉彎數更少,則更新狀態並放入 deque 進一步擴展。

終點判斷:

目標位置在 (n-1, e),可能從不同方向抵達,最後取三個方向中轉彎數最少的一個作為答案。

 
ZeroJudge Forum