演算法描述:
假設有一條繩子,上面有紅、白、藍三種顏色的旗子,起初繩子上的旗子顏色並沒有順序,您希望將之分類,並排列為藍、白、紅的順序,要如何移動次數才會最少,注意您只能在繩子上進行這個動作,而且一次只能調換兩個旗子。示意圖:
解法:
在一條繩子上移動,在程式中也就意味只能使用乙個陣列,而不使用其它的陣列來作輔助,問題的解法很簡單,您可以自己想像一下在移動旗子,從繩子開頭進行,遇到藍色往前移,遇到白色留在中間,遇到紅色往後移。
演算法的思想主要是:為了將所有的旗子按照藍白紅排列。
(1)設定b和w的指標放在開始,將r指標放在末尾
(2)移動w指標,遇到藍,則與b指標所指調換順序,w和b各加1;遇到白,則w+1;遇到紅,則與r調換,並且r=r-1
(3)當指標w和r相遇時,結束演算法
執行結果示例
; //初始化color陣列
//陣列長度為10,'\0'不算長度
int wflag=0;//記錄白旗顏色兼指標
int bflag=0;//記錄藍旗顏色兼指標
int rflag=strlen(color)-1;//記錄紅旗顏色兼指標
int i;
for(i=0;i
三色旗演算法
參考 三色旗的問題最早由e.w.dijkstra所提出,他所使用的用語為dutch nation flag dijkstra為荷蘭人 假設有一條繩子,上面有紅 白 藍三種顏色的旗子,起初繩子上的旗子顏色並沒有順序,您希望將之分類,並排列為藍 白 紅的順序,要如何移動次數才會最少,注意您只能在繩子上進...
趣味演算法 三色旗
趣味演算法 三色旗 一條繩子掛紅白藍三種顏色的旗子,且排列無序,現用程式把三種旗子同色歸類,順序為紅 白 藍,每次只能交換2面旗子,採用最少步驟完成。演算法描述 只需把紅色和藍色的旗子進行交換,紅旗和籃旗都就位後,白旗自然就位。1 從前向後設定紅旗的最後位置,如果該位置不是紅旗,向後掃瞄旗子佇列,如...
三色旗問題
三色旗問題 假設有乙個陣列,它有n個元素,每乙個不外乎是紅,白,藍3種顏色之一的代號,就用r,w,b代表。這些元素在陣列中並沒有依同樣顏色的元素排在一起的方式來排列,請寫乙個程式把這些元素排成所有藍色在前,接著是白色,最後是紅色的排列方式,不過在寫程式時要滿足下面的條件 1 不能用額外的記憶體,換句...