算法之三色旗

三色旗,顾名思义,就是三种颜色的旗子,红白蓝,乱序地寄在一根绳子上,现在需要按照顺序排列,分别是前面旗子为蓝色,中间为白色,后面为红色。每次只能调换两个旗子,如何在移动次数最少的情况下,排序成功。

本案例算法其实算是经典的排序问题,通过不断移动对比来进行排序,如下图所示:


假设排好序后,那么a代表头指针对应蓝色,b代表移动指针对应白色,c是尾指针对应红色;

核心思想是通过b的移动,并分别判断颜色,交换旗子,最终达到排序的目的。

如果b是白色,那么直接后移一位;(白色本身就应该在中间所以不处理)

如果b是蓝色,那么将a,b互换,同时a,b分别后移一位(蓝色需要换到头上,所以与a换,互换后,a,b各后移一位)

如果b是红色,那么将c,b互换,并且c前移一位(红色需要放到尾部,所以需要和c换,同时互换后c确认已经是红色,c直接前移)

基本程序如下:

#include<stdio.h>
#include<string.h>
#define BLUE 'b'
#define WHRITE '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','r','b','b','r','w','w','r','b','r','w','\0' };
   int wFlags = 0;
   int bFlags = 0;
   int rFlags = strlen(color)-1;
   int i;
   for(i=0;i<strlen(color);i++)
    printf("%c ",color[i]);
   printf("\n");
   while(wFlags <= rFlags){
    if(color[wFlags] == WHRITE) {
       wFlags++;
    } else if(color[wFlags] == BLUE) {
       swap(wFlags,bFlags);
       wFlags++;
       bFlags++;
    } else {
       swap(wFlags, rFlags);
       rFlags--;
    }
   }
   for(i=0;i<strlen(color);i++)
     printf("%c ",color[i]);
   return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值