學過數據結構的,第一感覺就是用“深度優先搜索”或者是“廣度優先算法”。就是不停的嘗試每一種可能,直到到達解。然后將嘗試的過程輸出即可。
這個求通路的有一個很有名的算法,Dijkstra算法(最短路徑算法)。
那么本問題就轉化為兩個步驟
1、用Dijkstra算法求出一條通路,這條通路也是最短通路,也就是最優解
2、根據輸入的初始狀態,生成一個集合,所有車子的一個位置排列為集合中的一個元素。并且為每一個元素建立他們之間的關系(有連線則表示能從一個排列移動一個位置到另一個排列,反之則無連線)。
注:寫完程序后,仔細想來,在本題中,由于各連線的長默認都是1,Dijkstra算法其實就是廣度優先算法。
例如:仔細觀察,我們可以發現每輛車的可能性位置可能性非常少(由于車子只能前后移動,故長度為3的車子只有4種可能,長度為2的車子有五種可能)。那么,則這些車子排列的可能性就不會多(原因是,如果車子多,則彼此之間的限制會很多,因為兩輛車不能擠在一個格子里,如果車子少,雖然限制少但是車子少,必然總數少)。這樣,一般的題目,把所有的車子排列構成一個集合的話,這個集合中的元素不會很多(實際情況是,一般的題目,這個集合的元素在1200左右)。
想到這里我想到用圖論的方法求解。
所有的車子的一個位置排列,成為圖中的一個點,兩點之間的連線表示能從一個排列移動一個位置到另一個排列。題目中的初始狀態為圖中的一個點,達到解題條件的為另一個點(這樣的點可能不止一個),問題就轉化為在圖中從一個點找到到另一個點的通路。
【 微信掃一掃 】