`

三色旗算法

阅读更多

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;
    }
}
0
4
分享到:
评论

相关推荐

    三色旗算法java版

    ### 三色旗算法Java版详解 #### 一、算法背景及定义 三色旗算法是一种经典的排序算法,最初由著名的计算机科学家Edsger W. Dijkstra提出,并以荷兰国旗的颜色(红、白、蓝)作为命名依据。该算法旨在解决在一个...

    三色旗源码 javascript版本

    用javascript来编写三色旗算法的源码,并且带有交换旗子的过程

    java算法—— 三色旗问题

    三色旗问题 * 最左边开始,遇到蓝色向左移,遇到白色不动,遇到红色右移

    c语言经典算法包括老掉牙,汉诺塔,三色旗

    三色棋 老鼠走迷官(一) 老鼠走迷官(二) 骑士走棋盘 八个皇后 八枚银币 生命游戏 字串核对 双色、三色河内塔 背包问题(Knapsack Problem) 数、运算 蒙地卡罗法求 PI Eratosthenes筛选求质数 超长...

    C/C++常用算法手册.秦姣华(有详细书签).rar

    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 爱因斯坦的...

    C经典算法之三色棋

    三色旗问题(Three-Color Flag Problem)最初由著名的计算机科学家Edsger W. Dijkstra提出,他在描述该问题时使用了“荷兰国旗问题”(Dutch National Flag Problem)这一术语,因为他是荷兰人。这个问题涉及到对一...

    数据结构经典算法大全 如 河内之塔 三色旗 老鼠走迷宫

    数据结构经典算法他全 如 河内之塔 三色旗 老鼠走迷宫 八皇后等等

    教学用智能机器人分拣练习系统-分捡箱子、汉诺塔、三色旗。

    智能分拣系统(目前仅有智能分拣模拟器,以后会扩展汉诺塔、三色旗等)共有三个版本选择:免费介绍版、竞赛版、高级版,免费介绍版仅能查看功能,操作仅限于10步;竞赛版可" + "随机或手动放置箱子,可练习分拣方法...

    经典算法大全

    3. **三色旗问题** 该问题涉及将一定数量的旗子分配到三组中,要求每组中包含不同颜色的旗子,实现这一分配的过程可以是算法练习的一部分。 4. **走迷宫** 走迷宫是一个搜索问题,可以通过回溯法、深度优先搜索...

    经典算法大全+共有51个例子.pdf

    C/C++的51个经典算法实例,包含有经典的河内之塔,费式数列,巴斯卡三角形,三色旗,老鼠走迷宫,八皇后,背包问题等,每个实例都有解析以及算法代码。

    比较经典问题的Java算法

    【Java算法】是编程领域中的重要组成部分,尤其在面试和实际开发中经常被考察和应用。本篇文章将探讨几个经典的Java算法实现,包括费式数列、巴斯卡三角形和三色棋问题。 1. **费式数列 (Fibonacci)** 费式数列是...

    常用算法深入学习实录

    黑白棋,八皇后,哥德巴赫猜想,自守数,矩阵运算,三色旗,青蛙过河等问题。

    大学算法大全(全是自己手写的)

    9. **三色旗**:这是一个常见的计算机科学问题,通常涉及数组处理和染色技巧。给定一个数组,通过三次染色使其满足特定条件,比如将数组分为三个连续的部分,使得每个部分内的元素都相同。这涉及到数组操作和逻辑...

    java经典算法系列.docx

    以上就是Java经典算法中的几个问题的介绍和解决方案,包括费式数列、巴斯卡三角形以及三色旗问题。这些算法在编程竞赛和面试中经常出现,对于提升编程思维和问题解决能力非常有帮助。了解并掌握这些算法,可以帮助...

    算法面试题实用知识库分享

    涵盖了二十多个算法面试题,涉及到爬楼梯、移动零、树的遍历、验证二叉搜索树、二进制/位运算相关、颜色分类/荷兰三色旗问题、零钱兑换、解码方法/数字字符串解码成字母的种类等多个方面的算法知识点。 算法笔记_...

    Java算法经典案列

    【Java算法经典案例】涉及了多个经典的算法问题,包括河内之塔、费式数列、巴斯卡三角形以及三色棋。这些算法都是计算机科学中的基础和重要组成部分,不仅在理论研究中占有重要地位,也在实际编程和解决问题中有着...

    Java算法之经典题目篇

    【Java经典算法】涵盖了许多有趣的数学与编程问题,如费式数列(Fibonacci)、巴斯卡三角形(Pascal's Triangle)以及三色旗问题(Three-Color Flags)。这些问题在算法设计和优化中有着重要的地位,对于学习和提升...

    java经典算法系列

    3. 三色旗问题(Three-Color Flags) 这个问题源于E.W. Dijkstra,要求将连续排列的红色、白色和蓝色旗子分成三堆,分别只包含同一种颜色的旗子。Java实现时,通常采用分治策略: ```java public class ...

Global site tag (gtag.js) - Google Analytics