Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 516|回复: 0

[算法学习]java解三色旗问题

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-19 00:09:59 | 显示全部楼层 |阅读模式
    问题:
        假设有一根绳子,上面有一些红、白、蓝色的旗子。起初旗子的顺序是任意的,现在要求用最少的次数移动这些旗子,使得它们按照蓝、白、红的顺序排列。注意只能在绳子上操作,并且一次只能调换两个旗子。 解法:从绳子的开头(最左边)开始,遇到蓝色的往前移,遇到白色的不动,遇到红色的往后移。  注:我们这里说的前移指往左,后移指往右。

        我们可以定义三个指针 a、b、c 。从下图可以看出,a和b指向第一个元素,c指向最后一个元素。a的作用是确保蓝色的旗子移到左边,而c的作用是确保红色的旗子移到右边。b则用于顺序访问各个旗子。
       再来看具体的代码实现,先看下图:  
      
       
       
         
       

         
       
      


    思路如下:
        查看b所指向的旗子的颜色:
          如果是白色的,则不移动任何旗子(因为要求白色的旗子在中间,所以不去动它),将b往后移一位。      如果是红色的,此时将b所指向的旗子和c所指向的旗子交换位置,同时c往前移一位。(交换后c指向的已经是红色的旗子了,所以可以往前移一位了)。      如果是蓝色的,此时将b所指向的旗子和a所指向的旗子交换位置,同时a往后移一位。(交换后a指向的已经是蓝色的旗子了,所以可以往后移一位了)。这里要注意的是b也要后移一位。

    注意的细节:

    第一,当b指向的是红色而和c交换时,如果此时c指向的是红色,显然没有必要把两个红色的旗子交换。所以这时应该把c前移,直到c指向的不是红色的时候才和b指向的旗子交换。当然移动时必须确保b<c。  第二,同样地,当b指向的是蓝色而要和a的指向交换时,如果a指向的不是蓝色,则交换。否则如果a指向的是蓝色,则也没有必要把两个蓝色的旗子交换。所以这时应该把a和b都往后移一位。
    1. import java.util.*;  
    2. public class ThreeColorFlag {  
    3.       
    4.     public static void main(String[] args) {           
    5.          
    6.           System.out.println("请输入三色旗的顺序(例如 BRRWWB):");  
    7.           Scanner scanner=new Scanner(System.in);  
    8.           String s=scanner.next();  
    9.           ThreeColorFlag tcf=new ThreeColorFlag();  
    10.           s=tcf.move(s.toUpperCase().toCharArray());  
    11.           System.out.println("排列好后的顺序:"+s);  
    12.     }  
    13.     //互相交换   
    14.     public void change(char[] flags,int x,int y){  
    15.          
    16.         System.out.println("交换前:"+new String(flags));  
    17.         char temp=flags[x];  
    18.         flags[x]=flags[y];  
    19.         flags[y]=temp;   
    20.         System.out.println((x+1)+" 号和 "+(y+1)+" 号交换");  
    21.         System.out.println("交换后:"+new String(flags));  
    22.     }  
    23.     public String move(char[] flags){  
    24.          
    25.          int a=0,b=0;  
    26.          int c=flags.length-1;  
    27.            
    28.          while(b<=c){  
    29.              switch (flags[b]){  
    30.                case "W":  
    31.                     b++;  
    32.                     break;  
    33.                case "B":  
    34.                    if(flags[a]=="B")  
    35.                        {a++;b++;}  
    36.                    else{  
    37.                    change(flags, a, b);  
    38.                    a++;  
    39.                    b++;  
    40.                    }  
    41.                    break;  
    42.                case "R":  
    43.                  while(b< c && flags[c]=="R")  
    44.                        c--;  
    45.                  if(flags[b]==flags[c])  return new String(flags);
    46.                          change(flags, b, c);  
    47.                       c--;
    48.                    break;  
    49.              }      
    50.               
    51.          }  
    52.          return new String(flags);  
    53.     }  
    54. }  
    复制代码

      

      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/11/19/000959609.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 07:41 , Processed in 0.331964 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表