算法之三色旗
来源:互联网 发布:剑三魏无羡捏脸数据 编辑:程序博客网 时间:2024/04/30 13:03
三色旗,顾名思义,就是三种颜色的旗子,红白蓝,乱序地寄在一根绳子上,现在需要按照顺序排列,分别是前面旗子为蓝色,中间为白色,后面为红色。每次只能调换两个旗子,如何在移动次数最少的情况下,排序成功。
本案例算法其实算是经典的排序问题,通过不断移动对比来进行排序,如下图所示:
假设排好序后,那么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 0
- 算法之三色旗
- 算法之三色旗
- 经典算法之三色旗
- 榆木脑壳练算法之三色旗问题
- 数据结构经典算法学习之三色旗
- 趣味算法-三色旗
- 三色旗算法
- 三色旗算法实现
- 算法思考---------三色旗
- [算法系列]三色旗
- 三色旗算法
- 三色旗算法
- 算法练习:两指针之三色排序
- 三色旗算法及其C程序
- 从三色旗算法到快速排序
- 每日一算法:三色旗问题
- 数据结构经典算法(4)三色旗
- 三色旗算法(C描述)
- memcache集群方案
- 【JZOJ5489】海明距离
- MATLAB中批量从txt文件中读取指定行的数据保存为txt文件
- 进程编程控制
- 无人驾驶汽车系统入门(五)——运动学自行车模型和动力学自行车模型
- 算法之三色旗
- python3多进程,单线程,网络请求密集型操作速度对比
- hibernate系列十七:Criteria查询
- @WebServlet("/A")问题
- 敏捷开发
- maven项目遇到cannot change version web module 3.0
- view.getX()、view.getY()、view.getLeft()、view.getRight()、view.getTranslationX()与动画
- AsynckTask异步加载
- Optimizing Realtime UVs