假设有一条绳子,上面有红、白、蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,您希望将之分类,并排列为蓝、白、红的顺序,要如何移动次数才会最少,注意您只能在绳子上进行这个动作,而且一次只能调换两个旗子。 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()这个方法谢谢!!!
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()这个方法谢谢!!!
所以跟哪个字母开头也没关系~~顺序是固定的 蓝 白 红
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位置想通了 交换结束~
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的位置开始移动,可以减少点次数。