【三色旗】

/*
三色旗
说明:
三色旗的问题最早由E.W.Dijkstra所提出,他所使用的用语为Dutch Nation Flag(Dijkstra为荷兰人),而大多数
的作者则使用Three-Color Flag来称之。

假设有一条绳子,上面有红,白,蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,您希望将之分类,并
排列为蓝,白,红的顺序,要如何移动次数才会最少,注意您只能在绳子上进行这份动作,而且一次只能调换
两个色旗子。

解法:
在一条绳子上移动,在程式中也就意味着只能使用一个阵列,而不能使用其他的阵列来作辅助,问题的解法很简单
您可以自己想像一下在移动旗子,从绳子开头进行,遇到蓝色往前移,遇到白色留在中间,遇到红色往后移,如下
所示:
只是要让移动的次数最少的话, 就要有些技巧:
    1.如果图中W所在位置为白色,则W+1, 表示未处理的部分移至白色群组。
    2.如果W部分为蓝色, 则B与W的元素对调,而B与W必须各 +1, 表示两个群组都多了一个元素。
    2.如果W所在的位置是红色,则将W与R交换,但R要减 1,表示未处理的部分减 1.

注意B,W,R并不是三色旗的个数,它们只是一个移动的指标;什么时候移动结束呢?一开始时未处理的R指标会是
等于旗子的总数,当R的索引数减至少于W的索引数时,表示接下来的旗子就是红色了,此时就可以结束移动,如下
所示:
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BLUE ‘b‘
#define WHITE ‘w‘
#define RED ‘r‘

#define SWAP(x, y)    {char temp; temp = color[x]; color[x] = color[y]; color[y] = temp;}

int main()
{
    char color[] = {‘r‘, ‘w‘, ‘b‘, ‘w‘, ‘w‘, ‘b‘, ‘r‘, ‘b‘, ‘w‘, ‘r‘, ‘\0‘};
    int wFlag = 0;
    int bFlag = 0;
    int rFlag = strlen(color) - 1;
    int i, count = 0;

    for(i = 0; i < strlen(color); i++)
    {
        printf("%c", color[i]);
    }
    printf("\n");

    printf("开始: \n");
    while(wFlag <= rFlag)
    {
        if(color[wFlag] == WHITE)
        {
            wFlag++;
        }
        else if(color[wFlag] == BLUE)
        {
            SWAP(bFlag, wFlag);
            bFlag++;
            wFlag++;
        }
        else
        {
            while(wFlag < rFlag && color[rFlag] == RED)
            {
                rFlag--;
            }
            SWAP(rFlag, wFlag);
            rFlag--;
        }
        for(i = 0; i < strlen(color); i++)
        {
            printf("%c", color[i]);
        }
        printf("\n");
        count++;
    }

    printf("\n最终:\n");
    for(i = 0; i < strlen(color); i++)
    {
        printf("%c", color[i]);
    }
    printf("\n共移动了 %d 次.", count);
    printf("\n");

    return 0;
}
时间: 2024-12-29 07:10:10

【三色旗】的相关文章

三色旗问题

说明 三色旗的问题最早由 E.W.Dijkstra 所提出,他所使用的用语为 Dutch Nation Flag(Dijkstra 为荷兰人),而多数的作者则使用 Three-Color Flag 来称之. 假设有一条绳子,上面有红.白.蓝三种颜色的旗子,起初绳子上的旗子颜色并没 有顺序,您希望将之分类,并排列为蓝.白.红的顺序,要如何移动次数才会最少,注意您只 能在绳子上进行这个动作,而且一次只能调换两个旗子. 1 #include<stdio.h> 2 #include<stdlib

三色旗

趣味算法-三色旗 一条绳子挂红白蓝三种颜色的旗子,且排列无序,现用程序把三种旗子同色归类,顺序为红-白-蓝,每次只能交换2面旗子,采用最少步骤完成. 算法描述:只需把红色和蓝色的旗子进行交换,红旗和篮旗都就位后,白旗自然就位. 1) 从前向后设定红旗的最后位置,如果该位置不是红旗,向后扫描旗子队列,如果发现红旗则与当前红旗位置的旗子交换. 2) 如果该位置是红旗,则向后移动红旗的最后位置. 3) 从后向前设定篮球的最前位置,如果该位置不是蓝旗,向前扫描旗子队列,如果发现蓝旗则与当前红旗位置的旗子

三色旗问题的解决

三色旗问题 1 问题由来 三色旗的问题最早由E.W.Dijkstra所提出,他所使用的用语为DutchNation Flag(Dijkstra为荷兰人),而多数的作者则使用Three-Color Flag来称之. 假设有一条绳子,上面有红.白.蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,您希望将之分类,并排列为蓝.白.红的顺序,要如何移动次数才会最少,注意您只能在绳子上进行这个动作,而且一次只能调换两个旗子. 2 解决思路: 三种颜色的旗子,白色居中,蓝色开头,红色结尾,如果想要移动的次数

算法分析之三色旗算法

一条绳子挂红白蓝三种颜色的旗子,且排列无序,现用程序把三种旗子同色归类,顺序为蓝-白-红,每次只能交换2面旗子,采用最少步骤完成. 算法描述:只需把红色和蓝色的旗子进行交换,红旗和篮旗都就位后,白旗自然就位. 1) 如果白旗所在位置的元素是白旗,表示该位置的元素应该在此,将white++,接着处理下一个旗子: 2) 如果white所在位置的元素是蓝旗,表示需将蓝旗与blue变量所在位置的元素对调,然后使blue++.white++,处理下一个旗子: 3) 如果white所在位置的元素是红旗,表示

三色旗算法

<?php $arr = array('r', 'b', 'w', 'b', 'b', 'w', 'r', 'w', 'r', 'r', 'b', 'w'); echo implode('--', $arr). "\n"; $wFlag = $bFlag = 0; $rFlag = count($arr) - 1; while($wFlag <= $rFlag){     if($arr[$wFlag] == 'w'){         $wFlag ++;     }el

javascript 算法

前段时间学习算法方面的知识看了一下用C语言写的一些简单的算法自己用js模拟实现一遍现在整理出来和大家分享一下. 河内塔 斐波那契数列 巴斯卡三角形 三色棋 河内之塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时北越的首都,即现在的胡志明市:1883年法国数学家Edouard Lucas曾提及这个故事,据说创世纪时Benares有一座波罗教塔,是由三支钻石棒(Pag)所支撑,开始时神在第一根棒上放置64个由上至下依由小至大排列的金盘

java 经典算法(转)

1.河内之塔.. 2.Algorithm Gossip: 费式数列. 3. 巴斯卡三角形 4.Algorithm Gossip: 三色棋 5.Algorithm Gossip: 老鼠走迷官(一) 6.Algorithm Gossip: 老鼠走迷官(二) 7.Algorithm Gossip: 骑士走棋盘 8.Algorithm Gossip: 八皇后 9.Algorithm Gossip: 八枚银币. 10.Algorithm Gossip: 生命游戏. 11.Algorithm Gossip:

ActionScript3游戏中的图像编程(连载十九)

1.4 浅析亮度与灰度/明度的关系 进入正题之前,先来了解一下灰度/明度. 1.4.1 灰度/明度的概念及其与HSB亮度的异同 在很多场合,灰度与明度的概念完全等价. “灰度”最初来源于摄影领域,在彩色显像技术问世以前,拍摄出来的照片只有黑,白,灰三类颜色,在这种黑白照片里,只有白色.黑色以及灰色的点能完好无损地显示出来,其它颜色将根据其亮度呈现出不同深度的灰色.亮度越大灰色越浅,反之越深.把黑与白色之间分成若干级,称为“灰度等级”.能呈现的灰度等级愈多,画面的层次感就愈丰富. 所以,从彩色转黑

《ActionScript3游戏中的图像编程》(连载十九)

1.4 浅析亮度与灰度/明度的关系 进入正题之前,先来了解一下灰度/明度. 1.4.1 灰度/明度的概念及其与HSB亮度的异同 在很多场合,灰度与明度的概念完全等价. "灰度"最初来源于摄影领域,在彩色显像技术问世以前,拍摄出来的照片只有黑,白,灰三类颜色,在这种黑白照片里,只有白色.黑色以及灰色的点能完好无损地显示出来,其它颜色将根据其亮度呈现出不同深度的灰色.亮度越大灰色越浅,反之越深.把黑与白色之间分成若干级,称为"灰度等级".能呈现的灰度等级愈多,画面的层次