zoukankan      html  css  js  c++  java
  • 算法分析之三色旗算法

    一条绳子挂红白蓝三种颜色的旗子,且排列无序,现用程序把三种旗子同色归类,顺序为蓝-白-红,每次只能交换2面旗子,采用最少步骤完成。

    算法描述:只需把红色和蓝色的旗子进行交换,红旗和篮旗都就位后,白旗自然就位。

    1) 如果白旗所在位置的元素是白旗,表示该位置的元素应该在此,将white++,接着处理下一个旗子;

    2) 如果white所在位置的元素是蓝旗,表示需将蓝旗与blue变量所在位置的元素对调,然后使blue++、white++,处理下一个旗子;

    3) 如果white所在位置的元素是红旗,表示需要将红旗与red变量的元素对调,然后将red--,继续处理下一旗子。

     1 namespace section10_threeFlags{
     2 int count;
     3 char color[]="rwbwwbrbwr";
     4 int blue,white,red;
     5 //exchange variable a and b
     6 void swap(char * a, char *b){
     7     char temp;
     8     int i;
     9     temp = *a;
    10     *a=*b;
    11     *b=temp;
    12     count++;
    13     printf("the %dth order exchanged
    ",count);
    14     for(i=0;i<(int)strlen(color);i++){
    15             printf("%c ",color[i]);
    16     }
    17     printf("
    ");
    18 }
    19 void threeFlags(){
    20     while(color[white]=='b'){
    21         blue++;
    22         white++;
    23     }
    24     while(color[red]=='r'){
    25         red--;
    26     }
    27     while(white<=red){
    28         if(color[white]=='r'){
    29             swap(&color[white],&color[red]);
    30             red--;
    31             while(color[red]=='r'){
    32                 red--;
    33             }
    34         }
    35         while(color[white]=='w'){
    36             white++;
    37         }
    38         if(color[white]=='b'){
    39             swap(&color[white],&color[blue]);
    40             blue++;
    41             white++;
    42         }
    43     }
    44 }
    45 void runThreeFlags(){
    46     int i,len;
    47     blue=white=0;
    48     len=strlen(color);
    49     red=len-1;
    50     count=0;
    51     printf("The original flags' array are as follows:
     ");
    52     for(i=0;i<len;i++){
    53         printf("%c ",color[i]);
    54     }
    55     printf("
    ");
    56     threeFlags();
    57     printf("The last result :
    ");
    58     for(i=0;i<len;i++){
    59         printf("%c ",color[i]);
    60     }
    61     printf("
    ");
    62 }
  • 相关阅读:
    Filebeat 日志收集器 安装和配置
    纠错式教学法对比鼓励式教学法 -----Lily、贝乐、英孚,乐加乐、剑桥国际、优学汇、北外青少
    硅谷夜谈
    指路Reactive Programming
    Spring WebFlux 要革了谁的命?
    flink部署操作-flink standalone集群安装部署
    Flink的高可用集群环境
    当怪物来敲门 经典台词
    浅析几种线程安全模型
    最详细的排序解析,理解七大排序
  • 原文地址:https://www.cnblogs.com/hoojjack/p/5208075.html
Copyright © 2011-2022 走看看