首页 > 代码库 > 三色旗

三色旗

趣味算法-三色旗

一条绳子挂红白蓝三种颜色的旗子,且排列无序,现用程序把三种旗子同色归类,顺序为红-白-蓝,每次只能交换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);
  }
}

三色旗