三色旗問題

2021-06-26 00:22:25 字數 1469 閱讀 1474

假設有一根繩子,上面有一些紅、白、藍色的旗子。起初旗子的順序是任意的,現在要求用最少的次數移動這些旗子,使得它們按照藍、白、紅的順序排列。注意只能在繩子上操作,並且一次只能調換兩個旗子。

分析:其實要移動旗子得到要求的結果很簡單,但是需要注意的是需要移動最少的次數這個限制條件。

網上的一種解法:

從繩子開頭進行,遇到藍色往前移,遇到白色留在中間,遇到紅色往後移,如下所示:

只是要讓移動次數最少的話,就要有些技巧:

如果圖中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則繼續前進,...

三色旗演算法

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