import java.util.Arrays;
/**
问题:
假设有一条绳子,上面有红、白、蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,
您希望将之分类,并排列为蓝、白、红的顺序,要如何移动次数才会最少,注意您只能在绳
子上进行这个动作,而且一次只能调换两个旗子。
网上的解法大多类似:
在一条绳子上移动,在程式中也就意味只能使用一个阵列,而不使用其它的阵列来作辅助,
问题的解法很简单,您可以自己想像一下在移动旗子,从绳子开头进行,遇到蓝色往前移,
遇到白色留在中间,遇到红色往后移。
只是要让移动次数最少的话,就要有些技巧:
如果图中W所在的位置为白色,则W+1,表示未处理的部份移至至白色群组。
如果W部份为蓝色,则B与W的元素对调,而B与W必须各+1,表示两个群组都多了一个元素。
如果W所在的位置是红色,则将W与R交换,但R要减1,表示未处理的部份减1。
注意B、W、R并不是三色旗的个数,它们只是一个移动的指标;
什么时候移动结束呢?一开始时未处理的R指标会是等于旗子的总数,
当R的索引数减至少于W的索引数时,表示接下来的旗子就都是红色了,此时就可以结束移动
其实这个算法不复杂,自己拿一个实例来把算法走一遍就理解了
核心就是维护b,w,r这三个指针(下标):
w作为当前元素的下标,而b则表示下标在b之前的旗子颜色都是蓝色,r表示下标在r后面的都是红色,不符合这个条件的,就交换
*/
public class ThreeColorFlag {
public static void main(String[] args) {
char[] flags = "rbbwwbrbw".toCharArray();
sort(flags);
System.out.println(Arrays.toString(flags));
}
public static void sort(char[] flags) {
if (flags == null || flags.length <= 1) {
return;
}
int b = 0;
int w = 0;
int r = flags.length - 1;
while (w <= r) {
switch (flags[w]) {
case 'w':
w++;
break;
case 'b':
swap(flags, w, b);
w++;
b++; //b总是跟在w后面
break;
case 'r':
swap(flags, w, r);
r--;
break;
default:
throw new IllegalArgumentException("invalid input");
}
}
}
private static void swap(char[] array, int i, int j) {
char tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
}
分享到:
相关推荐
### 三色旗算法Java版详解 #### 一、算法背景及定义 三色旗算法是一种经典的排序算法,最初由著名的计算机科学家Edsger W. Dijkstra提出,并以荷兰国旗的颜色(红、白、蓝)作为命名依据。该算法旨在解决在一个...
用javascript来编写三色旗算法的源码,并且带有交换旗子的过程
三色旗问题 * 最左边开始,遇到蓝色向左移,遇到白色不动,遇到红色右移
三色棋 老鼠走迷官(一) 老鼠走迷官(二) 骑士走棋盘 八个皇后 八枚银币 生命游戏 字串核对 双色、三色河内塔 背包问题(Knapsack Problem) 数、运算 蒙地卡罗法求 PI Eratosthenes筛选求质数 超长...
10.12.1 三色旗算法 335 10.12.2 三色旗求解 337 10.13 渔夫捕鱼 339 10.13.1 渔夫捕鱼算法 339 10.13.2 渔夫捕魚求解 340 10.14 爱因斯坦的阶梯 341 10.14.1 爱因斯坦的阶梯算法 341 10.14.2 爱因斯坦的...
三色旗问题(Three-Color Flag Problem)最初由著名的计算机科学家Edsger W. Dijkstra提出,他在描述该问题时使用了“荷兰国旗问题”(Dutch National Flag Problem)这一术语,因为他是荷兰人。这个问题涉及到对一...
数据结构经典算法他全 如 河内之塔 三色旗 老鼠走迷宫 八皇后等等
智能分拣系统(目前仅有智能分拣模拟器,以后会扩展汉诺塔、三色旗等)共有三个版本选择:免费介绍版、竞赛版、高级版,免费介绍版仅能查看功能,操作仅限于10步;竞赛版可" + "随机或手动放置箱子,可练习分拣方法...
3. **三色旗问题** 该问题涉及将一定数量的旗子分配到三组中,要求每组中包含不同颜色的旗子,实现这一分配的过程可以是算法练习的一部分。 4. **走迷宫** 走迷宫是一个搜索问题,可以通过回溯法、深度优先搜索...
C/C++的51个经典算法实例,包含有经典的河内之塔,费式数列,巴斯卡三角形,三色旗,老鼠走迷宫,八皇后,背包问题等,每个实例都有解析以及算法代码。
【Java算法】是编程领域中的重要组成部分,尤其在面试和实际开发中经常被考察和应用。本篇文章将探讨几个经典的Java算法实现,包括费式数列、巴斯卡三角形和三色棋问题。 1. **费式数列 (Fibonacci)** 费式数列是...
黑白棋,八皇后,哥德巴赫猜想,自守数,矩阵运算,三色旗,青蛙过河等问题。
9. **三色旗**:这是一个常见的计算机科学问题,通常涉及数组处理和染色技巧。给定一个数组,通过三次染色使其满足特定条件,比如将数组分为三个连续的部分,使得每个部分内的元素都相同。这涉及到数组操作和逻辑...
以上就是Java经典算法中的几个问题的介绍和解决方案,包括费式数列、巴斯卡三角形以及三色旗问题。这些算法在编程竞赛和面试中经常出现,对于提升编程思维和问题解决能力非常有帮助。了解并掌握这些算法,可以帮助...
涵盖了二十多个算法面试题,涉及到爬楼梯、移动零、树的遍历、验证二叉搜索树、二进制/位运算相关、颜色分类/荷兰三色旗问题、零钱兑换、解码方法/数字字符串解码成字母的种类等多个方面的算法知识点。 算法笔记_...
【Java算法经典案例】涉及了多个经典的算法问题,包括河内之塔、费式数列、巴斯卡三角形以及三色棋。这些算法都是计算机科学中的基础和重要组成部分,不仅在理论研究中占有重要地位,也在实际编程和解决问题中有着...
【Java经典算法】涵盖了许多有趣的数学与编程问题,如费式数列(Fibonacci)、巴斯卡三角形(Pascal's Triangle)以及三色旗问题(Three-Color Flags)。这些问题在算法设计和优化中有着重要的地位,对于学习和提升...
3. 三色旗问题(Three-Color Flags) 这个问题源于E.W. Dijkstra,要求将连续排列的红色、白色和蓝色旗子分成三堆,分别只包含同一种颜色的旗子。Java实现时,通常采用分治策略: ```java public class ...