問題描述:
假設有一條繩子,上面有紅、白、藍三種顏色的旗子,起初繩子上的旗子顏色並沒有順序,您
希望將之分類,並排列為藍、白、紅的順序,要如何移動次數才會最少,注意您只能在繩子上
進行這個動作,而且一次只能調換兩個旗子。
#include #include程式**using
namespace
std;
//三色旗演算法:
//假設有一條繩子,上面有紅、白、藍三種顏色的旗子,起初繩子上的旗子顏色並沒有順序,您
//希望將之分類,並排列為藍、白、紅的順序,要如何移動次數才會最少,注意您只能在繩子上
//進行這個動作,而且一次只能調換兩個旗子。
//演算法說明:要使用最少的個數,就是用乙個腳標從頭開始移動,碰到紅色就放到前面,碰到藍色就放到後面,白色的就不動
//得要三個腳標,乙個用來儲存紅色最後項的位置,乙個儲存藍色的
#define maxsize 30
//0表示紅色r,1表示白色w,2表示藍色b
#define red 0
#define white 1
#define blue 2
int r = 0;//
j記錄紅色旗幟的位置,初始話0
int scan = 0;//
游標,用於全域性掃瞄
int b = maxsize-1;//
藍色旗幟位置,初始化為最大位置的後一位
//輸出陣列的資訊,便於觀察
void printf_flag(int *line,int
size)
cout
<
}int correct_flag(int *line,int begin,int
end)
while(line[r] ==red)
scan =r;
//開始掃瞄
while(scan <= b)//
掃瞄終止條件,游標與末尾的藍色游標相遇
while(line[r] == red && r <=scan)
int temp =line[scan];
switch
(line[scan])
scan++;
break
;
case white://
假如是白色
scan++;
break
;
case blue://
假如是藍色
line[scan] =line[b];
line[b] =temp;
step++;
b--;
if (line[scan] ==red)
scan++;
break
;
default
:
break
; }
printf_flag(line,maxsize);
}return
step;
}int
main()
printf_flag(line,maxsize);
int a = correct_flag(line,0,maxsize-1
); cout
<
total steps:
"system(
"pause");
return0;
}
程式執行結果
**看起來很長,但是有一部分主要用於**優化,減少移動次數,比如每次迴圈開始時進行游標優化等,具體的實現在**裡面都有注釋,就不多講了,(ps,這個程式的容錯性還比較差啊)
雙色 三色排序問題
實現乙個函式,給定乙個陣列,要求使得陣列中負數在所有正數的前面 實現乙個函式,給定乙個陣列,要求使得陣列中負數在前正數在後零在中間 1 include2 include34 輸出陣列元素 5void print int arr,int len 6 交換兩個數 7void swap int left,...
三色旗問題
三色旗問題 假設有乙個陣列,它有n個元素,每乙個不外乎是紅,白,藍3種顏色之一的代號,就用r,w,b代表。這些元素在陣列中並沒有依同樣顏色的元素排在一起的方式來排列,請寫乙個程式把這些元素排成所有藍色在前,接著是白色,最後是紅色的排列方式,不過在寫程式時要滿足下面的條件 1 不能用額外的記憶體,換句...
三色旗問題
假設有一根繩子,上面有一些紅 白 藍色的旗子。起初旗子的順序是任意的,現在要求用最少的次數移動這些旗子,使得它們按照藍 白 紅的順序排列。注意只能在繩子上操作,並且一次只能調換兩個旗子。分析 其實要移動旗子得到要求的結果很簡單,但是需要注意的是需要移動最少的次數這個限制條件。網上的一種解法 從繩子開...