我在做家庭作業(C++)時遇到了麻煩。我並不是要求完整的解決方案,但向正確的方向傾斜可能會有所幫助。 :)船上數字的最短路徑
我在該板上有一個NxN板(最大N = 100)和一個1x2的數字(立方體)。立方體一側塗成紅色,另一側塗成藍色。爲立方體默認位置留在板的上側角,藍色的一面朝上:
B B . .
. . . .
. . . .
. . . .
(4×4例子中,B代表藍色)
有可能是在黑板上的寶石(障礙物)。 移到我可以用我的身材令:
- 旋轉它90/180/270度順時針
- 可以前後翻頁的左/右/上/下邊緣的立方體,改變它的'向上顏色 ''
有關示例,使用權利上的默認位置翻轉:
. . R R
. . . .
. . . .
. . . .
,然後使用旋轉90:
. . R .
. . R .
. . . .
. . . .
,然後使用翻轉左:
. B . .
. B . .
. . . .
. . . .
當然,旋轉或翻轉時,你不能降落在石碑上。 因此,問題是 - 對於任何給定的電路板配置(圖形位置和石頭位置)編寫一個程序,該程序將使默認位置(藍色方向向上!)使用最少的移動次數並返回1如果可能或返回0如果這是不可能的。
我覺得這個問題很有趣,但我不得不承認我對它有些困惑。特別是藍色的一面/紅色的一面。我無法真正弄清楚如何「翻譯」我可以用通常最短路徑算法的語言來使用這些移動(並且我從未使用過任何這些算法)。 所以,我會很感激你的每一條建議! :)
紅色/藍色的東西只是增加了一個反轉旋轉方向的成本。即您的成本函數需要採用方向參數添加返回非對稱成本圖。 – starbolin
實際上它比這更復雜,因爲翻轉實際上是以無法實現旋轉的方式將立方體從其初始位置移開。並不總是可能在路徑的盡頭翻轉。 –
關鍵是推導一個成本函數以達到每個可能的相鄰位置。搜索'成本空間'需要處理達到給定位置的'如何'。 – starbolin