三色旗演算法

2021-09-30 13:19:07 字數 1081 閱讀 5754

參考:

三色旗的問題最早由e.w.dijkstra所提出,他所使用的用語為dutch nation flag(dijkstra為荷蘭人),假設有一條繩子,上面有紅、白、藍三種顏色的旗子,起初繩子上的旗子顏色並沒有順序,您希望將之分類,並排列為藍、白、紅的順序,要如何移動次數才會最少,注意您只能在繩子上進行這個動作,而且一次只能調換兩個旗子。

問題分析

這個問題我們可以將這個問題視為乙個陣列排序問題,這個陣列分為前部,中部和後部三個部分,每乙個元素(紅白藍分別對應blue、white、red)必屬於其中之一。由於紅、白、藍三色小球數量並不一定相同,所以這個三個區域不一定是等分的,也就是說如果我們將整個區域放在[0,1]的區域裡,由於三色小球之間數量的比不同(此處假設1:2:2),可能前部為[0,0.2),中部為[0.2,0.6),後部為[0.6,1]。

我們的思路如下:將前部和後部各排在陣列的前邊和後邊,中部自然就排好了。具體的:

設定兩個標誌位begin和end分別指向這個陣列的開始和末尾,然後用乙個標誌位current從頭開始進行遍歷:

1)若遍歷到的位置為blue,則說明它一定屬於前部,於是就和begin位置進行交換,然後current向前進,begin也向前進(表示前邊的已經都排好了)。

2)若遍歷到的位置為white,則說明它一定屬於中部,根據總思路,中部的我們都不動,然後current向前進。

3)若遍歷到的位置為red,則說明它一定屬於後部,於是就和end位置進行交換,由於交換完畢後current指向的可能是屬於前部的,若此時current前進則會導致該位置不能被交換到前部,所以此時current不前進。而同1),end向後退1。

php**

private function swap(&$var1,&$var2)

private function shuffle(&$tricolors) else if($tricolors[$current] == "white") else }}

public function tricolor()

三色旗演算法

演算法描述 假設有一條繩子,上面有紅 白 藍三種顏色的旗子,起初繩子上的旗子顏色並沒有順序,您希望將之分類,並排列為藍 白 紅的順序,要如何移動次數才會最少,注意您只能在繩子上進行這個動作,而且一次只能調換兩個旗子。示意圖 解法 在一條繩子上移動,在程式中也就意味只能使用乙個陣列,而不使用其它的陣列...

趣味演算法 三色旗

趣味演算法 三色旗 一條繩子掛紅白藍三種顏色的旗子,且排列無序,現用程式把三種旗子同色歸類,順序為紅 白 藍,每次只能交換2面旗子,採用最少步驟完成。演算法描述 只需把紅色和藍色的旗子進行交換,紅旗和籃旗都就位後,白旗自然就位。1 從前向後設定紅旗的最後位置,如果該位置不是紅旗,向後掃瞄旗子佇列,如...

三色旗問題

三色旗問題 假設有乙個陣列,它有n個元素,每乙個不外乎是紅,白,藍3種顏色之一的代號,就用r,w,b代表。這些元素在陣列中並沒有依同樣顏色的元素排在一起的方式來排列,請寫乙個程式把這些元素排成所有藍色在前,接著是白色,最後是紅色的排列方式,不過在寫程式時要滿足下面的條件 1 不能用額外的記憶體,換句...