假设有一条绳子,上面有红、白、蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,您希望将之分类,并排列为蓝、白、红的顺序,要如何移动次数才会最少,注意您只能在绳子上进行这个动作,而且一次只能调换两个旗子。 import java.io.*;
public class ThreeColorsFlags {
private 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 wFlag = 0;
int bFlag = 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 Exception {
 BufferedReader buf; 
        buf = new BufferedReader(
                    new InputStreamReader(System.in));          System.out.print("输入三色旗的顺序:");
        String flags = buf.readLine();
        
        ThreeColorsFlags threeColorsFlag = new ThreeColorsFlags();
        flags = threeColorsFlag.move(
                   flags.toUpperCase().toCharArray());
        
        System.out.println("移动后的顺序:" + flags+" ");  


}}
按我的理解:r w b三色颜色 任意组合有6种:
r w b 
r b w
w r b 
w b r 
b w r 
b r w 
按照上面的程序 代入以w开头输入的 还可以理解程序是怎么运行的 但要是代入其他字母开头的 就理解不了本人自学Java不久  有些东西理解不是很透彻  望大家帮忙一下 !!!任意一种顺序输入 程序是如何运行的 尤其是mov()这个方法谢谢!!!

解决方案 »

  1.   

    这个代码 算法和组合没啥关系啊~~
    所以跟哪个字母开头也没关系~~顺序是固定的 蓝 白 红
    wFlag 是记录当前判定字符的位置
    bFlag 是记录最左边的W在字符串中的位置白色居中   所以从你输入的字符串的第一个字符判断 第一个字母是 W 不变wFlag+1,第一个字母是B则把当前位置的B和最左边的W进行交换。所以W整体右移以为wFlag+1,bFlag+1. 第一个字母是R,如果最右边字符时R,则rFlag-1,即找到从右边数第一个不是R的字符和当前的字符交换,交换完了rFlag-1然后进行第二次循环判断第二个字符所以简单说 就是遍历字符串 W位置不变  碰到B和最左边的W进行交换  碰到R交换到从右边数第一个不为R的位置。 当前判定的字符位置和rFlag位置想通了 交换结束~
      

  2.   

    这个次数多少 跟每种颜色旗子的数量以及分布有关,所以要达到最优化状态要先统计三种旗子的分散范围以及各自数量。如果不知道数量LZ发的代码移动次数应该是很优化了。稍微改动就是
                    else if(flags[wFlag] == 'B') {
                        swap(flags, bFlag, wFlag);
                        bFlag++;
                        wFlag++;
                    }
    交换之前可以向
                    else {
                        while(wFlag < rFlag && flags[rFlag] == 'R')
                            rFlag--;
                        swap(flags, rFlag, wFlag);
                        rFlag--;                
                    }
    一样做个循环判断,从左边第一个不为B的位置开始移动,可以减少点次数。