标签:
趣味算法-三色旗
一条绳子挂红白蓝三种颜色的旗子,且排列无序,现用程序把三种旗子同色归类,顺序为红-白-蓝,每次只能交换2面旗子,采用最少步骤完成。
算法描述:只需把红色和蓝色的旗子进行交换,红旗和篮旗都就位后,白旗自然就位。
1) 从前向后设定红旗的最后位置,如果该位置不是红旗,向后扫描旗子队列,如果发现红旗则与当前红旗位置的旗子交换。
2) 如果该位置是红旗,则向后移动红旗的最后位置。
3) 从后向前设定篮球的最前位置,如果该位置不是蓝旗,向前扫描旗子队列,如果发现蓝旗则与当前红旗位置的旗子交换。
4) 如果该位置是蓝旗,则向前移动蓝旗的最后位置。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* 三色旗
*
* @author Administrator
*
*/
public class ThreeColorsFlags {
public void swap(char[] flags, int x, int y) {
char temp;
temp = flags[x];
flags[x] = flags[y];
flags[y] = temp;
}
public String move(char[] flags) {
int bFlag = 0;
int wFlag = 0;
int rFlag = flags.length - 1;
while (wFlag <= rFlag) {
if (flags[wFlag] == ‘W‘) {
wFlag++;
} else if (flags[wFlag] == ‘B‘) {
swap(flags, bFlag, wFlag);
bFlag++;
wFlag++;
} else {
while (wFlag < rFlag && flags[rFlag] == ‘R‘)
rFlag--;
swap(flags, rFlag, wFlag);
rFlag--;
}
}
return new String(flags);
}
public static void main(String[] args) throws IOException {
BufferedReader buf = new BufferedReader(
new InputStreamReader(System.in));
System.out.println("输入三色旗的顺序(ex.RWBBWRWR):");
String flags = buf.readLine();
ThreeColorsFlags threeColorsFlags = new ThreeColorsFlags();
flags = threeColorsFlags.move(flags.toUpperCase().toCharArray());
System.out.println("移动顺序后:" + flags);
}
}
标签:
原文地址:http://www.cnblogs.com/kimyong/p/5943386.html