当前位置:   article > 正文

算法之三色旗_三色旗算法

三色旗算法

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

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


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

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

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

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

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

基本程序如下:

  1. #include<stdio.h>
  2. #include<string.h>
  3. #define BLUE 'b'
  4. #define WHRITE 'w'
  5. #define RED 'r'
  6. #define swap(x,y) { char temp; \
  7. temp = color[x]; \
  8. color[x] = color[y]; \
  9. color[y] = temp; \
  10. }
  11. int main()
  12. {
  13. char color[]={'r','w','r','b','b','r','w','w','r','b','r','w','\0' };
  14. int wFlags = 0;
  15. int bFlags = 0;
  16. int rFlags = strlen(color)-1;
  17. int i;
  18. for(i=0;i<strlen(color);i++)
  19. printf("%c ",color[i]);
  20. printf("\n");
  21. while(wFlags <= rFlags){
  22. if(color[wFlags] == WHRITE) {
  23. wFlags++;
  24. } else if(color[wFlags] == BLUE) {
  25. swap(wFlags,bFlags);
  26. wFlags++;
  27. bFlags++;
  28. } else {
  29. swap(wFlags, rFlags);
  30. rFlags--;
  31. }
  32. }
  33. for(i=0;i<strlen(color);i++)
  34. printf("%c ",color[i]);
  35. return 0;
  36. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/744986
推荐阅读
相关标签
  

闽ICP备14008679号