假設有一根繩子,上面有一些紅、白、藍色的旗子。起初旗子的順序是任意的,現在要求用最少的次數移動這些旗子,使得它們按照藍、白、紅的順序排列。注意只能在繩子上操作,並且一次只能調換兩個旗子。
分析:其實要移動旗子得到要求的結果很簡單,但是需要注意的是需要移動最少的次數這個限制條件。
網上的一種解法:
從繩子開頭進行,遇到藍色往前移,遇到白色留在中間,遇到紅色往後移,如下所示:
只是要讓移動次數最少的話,就要有些技巧:
如果圖中w所在的位置為白色,則w+1,表示未處理的部份移至至白色群組。
如果w部份為藍色,則b與w的元素對調,而b與w必須各+1,表示兩個群組都多了乙個元素。
如果w所在的位置是紅色,則將w與r交換,但r要減1,表示未處理的部份減1。
注意b、w、r並不是三色旗的個數,它們只是乙個移動的指標;什么時候移動結束呢?一開始
時未處理的r指標會是等於旗子的總數,當r的索引數減至少於w的索引數時,表示接下來的旗
子就都是紅色了,此時就可以結束移動,如下所示:
該程式選自:經典演算法大全 老奔整理 email: [email protected]
#include #include #include #include #define blue 'b'
#define white 'w'
#define red 'r'
using namespace std;
int times = 0;
char color = ;
//#define swap(x, y)
void printarr()
;//char szflaginput[1024] = ;
void exchangecolor(char *psour, char *pdes)
while(pred > szflaginput && *pred!= 'b')
pred--;
if(pred > pblue)
exchangecolor(pblue, pred); }
}//藍色旗幟調整完畢後,調整紅色旗幟
void scansecond()
else
break;
} if (pred != szflaginput) //有藍色的旗幟
}} //調整紅色旗幟
if(pred == szflaginput + strlen(szflaginput))
return;
pwhite = szflaginput + strlen(szflaginput) -1;
while (pwhite > pred) }
}int main(){
cout<
程式執行結果為3,無冗餘移動步驟:
三色旗問題
三色旗問題 假設有乙個陣列,它有n個元素,每乙個不外乎是紅,白,藍3種顏色之一的代號,就用r,w,b代表。這些元素在陣列中並沒有依同樣顏色的元素排在一起的方式來排列,請寫乙個程式把這些元素排成所有藍色在前,接著是白色,最後是紅色的排列方式,不過在寫程式時要滿足下面的條件 1 不能用額外的記憶體,換句...
Algorithm Gossip 三色旗問題
問題 假設有一條繩子,上面有紅白藍三種顏色的旗子,開始時旗子的顏色並沒有順序,現將其分類,排成藍白紅的順序,每次只能調換兩個旗子,問怎樣移動次數最少?演算法分析 排列順序是b w r,定義三個指標 1 b永遠指向第乙個不是b的元素 2 w是遍歷的指標,向前移動,並判斷指向元素,如果指向w則繼續前進,...
三色旗演算法
演算法描述 假設有一條繩子,上面有紅 白 藍三種顏色的旗子,起初繩子上的旗子顏色並沒有順序,您希望將之分類,並排列為藍 白 紅的順序,要如何移動次數才會最少,注意您只能在繩子上進行這個動作,而且一次只能調換兩個旗子。示意圖 解法 在一條繩子上移動,在程式中也就意味只能使用乙個陣列,而不使用其它的陣列...