java之三色旗问题求解!
程序员文章站
2022-06-28 23:06:34
三色旗问题求解!问题:有一条绳子上面挂有白、红、蓝三种颜色的多面旗子,这些旗子的排列是无序的。* 现在要将绳子上的旗子按蓝、白、红三种颜色进行归类排列,* 但是只能在绳子上进行旗子的移动,并且每次只能调换两个旗子。* 问如何采用最少的步骤来完成三色旗的排列呢?效果如下:代码:/** * */package javaLearn;/** * @author Administrator *qq:1012885458 */public class 三色旗 {/* * 有...
三色旗问题求解!
问题:
有一条绳子上面挂有白、红、蓝三种颜色的多面旗子,这些旗子的排列是无序的。
* 现在要将绳子上的旗子按蓝、白、红三种颜色进行归类排列,
* 但是只能在绳子上进行旗子的移动,并且每次只能调换两个旗子。
* 问如何采用最少的步骤来完成三色旗的排列呢?
效果如下:
代码:
/**
*
*/
package javaLearn;
/**
* @author Administrator
*qq:1012885458
*/
public class 三色旗 {
/*
* 有一条绳子上面挂有白、红、蓝三种颜色的多面旗子,这些旗子的排列是无序的。
* 现在要将绳子上的旗子按蓝、白、红三种颜色进行归类排列,
* 但是只能在绳子上进行旗子的移动,并且每次只能调换两个旗子。
* 问如何采用最少的步骤来完成三色旗的排列呢?*/
static int count=0;//定义对调的次数
static char color[]="rwbbwwbwbrbwr".toCharArray();
static int white ,red ,blue;
//对调以及显示
static void swrap(char[] c,int x,int y) {
int i;
char temp;
temp=c[x];
c[x]=c[y];
c[y]=temp;
count++;//对调次数加一;
System.out.printf("第%d次对调后:",count);
for( i=0;i<color.length;i++) {
System.out.printf(" %c",color[i]);
}
System.out.printf("\n");
}
static void threeFlags() {
while(color[white]=='b') {//blue 蓝旗
blue++;//向后移动蓝旗
white++;//向后移动白旗
}
while(color[red]=='r') {
red--;//向前移动红旗
}
while(white<=red) {
if(color[white]=='r') {
//红旗
swrap(color,white,red);//对调红旗和白旗
red--;
while(color[red]=='r') {
red--; //向前移动红旗
}
}
while(color[white]=='w') {
white++;
}
if(color[white]=='b') {
swrap(color,white,blue);
blue++;
white++;
}
}
}
public static void main(String args[]) {
int i;
blue=0; //指针位置初始化
white=0;
red=color.length-1;//红色指向最后
count=0;
System.out.println("三色旗问题求解!");
System.out.printf("三色旗最初排列效果:\n");
System.out.printf(" ");
for(i=0;i<=red;i++) {
System.out.printf(" %c",color[i]);
}
System.out.printf("\n");
threeFlags();
System.out.printf("通过%d次完成对调,最终的结果如下:\n",count);
for(i=0;i<color.length;i++) {
System.out.printf(" %c",color[i]);
}
System.out.printf(" \n");
}
}
原理:
本文地址:https://blog.csdn.net/weixin_42590083/article/details/111999108
上一篇: springboot集成redis
下一篇: java中静态关键字static的概述