C語言程式設計 C語言三色旗問題!

2022-06-05 06:18:07 字數 1620 閱讀 8872

有一根繩子,上面有紅、白、藍三種顏色的旗子。繩子上旗子的顏色並沒有順序,現在要對旗子進行分類,按照藍色、白色、紅色的順序排列。只能在繩子上進行移動,並且一次只能調換兩面旗子,怎樣移動才能使旗子移動的次數最少?

旗子在繩子上移動,而且一次只能調換兩面旗子,因此只要保證在移動旗子時,從繩子的開頭開始,遇到藍色旗子向前移動,遇到白色旗子則留在中間,而遇到紅色的旗子則向後移動。要使移動次數最少,可以使用三個指標 b、w、r 分別作為藍旗、白旗和紅旗的指標。

若 w 指標指向的當前旗子為白色,則 w 指標增加 1,表示白旗部分增加一面。若 w 指標指向的當前旗子為藍色,則將 b 指標與 w 指標所指向的旗子交換,同時 b 指標與 w 指標都增加 1,表示藍旗和白旗部分都多了乙個元素。

若 w 指標指向的當前旗子為紅色,則將 w 指標與 r 指標所指向的旗子交換,同時 r 指標減 1,即 r 指標向前移動,未處理的部分減 1。

剛開始時,r 指向繩子中最後乙個旗子,之後 r 指標不斷前移,當其位於 w 指標之前,即 r 的值小於 w 的值時,全部旗子處理完畢,可以結束比較和移動旗子操作。

在程式中通過巨集定義用大寫字母 'b' 'w' 'r' 分別代表藍色、白色和紅色;字元陣列 「char color」表示繩子上的各種顏色的旗子;旗子移動時通過乙個 while 迴圈判斷移動過程是否結束,在 while 迴圈中根據旗子的不同顏色進行不同的處理。

#include #include 

#include

#define blue 'b'

#define white 'w'

#define red 'r'

#define swap(x,y)

intmain()

;

int w=0

;

int b=0

;

int r=strlen(color)-1

;

inti;

for(i=0;i)

printf(

"%c

",color[i]);

printf("\n

");while(w<=r)

else}}

for(i=0;i)

printf(

"%c

",color[i]);

printf("\n

");return0;

}

交換前旗子顏色排列順序及按順序最少次數移動旗子後的排列順序如下所示:

r w b w w b r b w r

b b b w w w w r r r

在該例項中,分別用語句「int w=0;」「int b = 0;」「int r=strlen(color)-1;」定義並初始化白旗、藍旗、紅旗的指標 w、b、r。

在交換不同顏色旗子時,通過旗子的指標實現交換函式 swap 的功能。

最後,不管你是轉行也好,初學也罷,高階也可,如果你想學程式設計~

【值得關注】我的c/c++程式設計學習交流俱樂部【點選進入】

三色旗問題

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

三色旗問題

假設有一根繩子,上面有一些紅 白 藍色的旗子。起初旗子的順序是任意的,現在要求用最少的次數移動這些旗子,使得它們按照藍 白 紅的順序排列。注意只能在繩子上操作,並且一次只能調換兩個旗子。分析 其實要移動旗子得到要求的結果很簡單,但是需要注意的是需要移動最少的次數這個限制條件。網上的一種解法 從繩子開...

Algorithm Gossip 三色旗問題

問題 假設有一條繩子,上面有紅白藍三種顏色的旗子,開始時旗子的顏色並沒有順序,現將其分類,排成藍白紅的順序,每次只能調換兩個旗子,問怎樣移動次數最少?演算法分析 排列順序是b w r,定義三個指標 1 b永遠指向第乙個不是b的元素 2 w是遍歷的指標,向前移動,並判斷指向元素,如果指向w則繼續前進,...