三色旗幟分類

2022-09-02 06:30:14 字數 1930 閱讀 3618

問題描述:

假設有一條繩子,上面有紅、白、藍三種顏色的旗子,起初繩子上的旗子顏色並沒有順序,您

希望將之分類,並排列為藍、白、紅的順序,要如何移動次數才會最少,注意您只能在繩子上

進行這個動作,而且一次只能調換兩個旗子。

#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 不能用額外的記憶體,換句...

三色旗問題

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