[算法系列]三色旗
来源:互联网 发布:淘宝退货率怎么看 编辑:程序博客网 时间:2024/05/01 01:21
写在前面:
我是一个小小的程序员,我的野心是成为一个全栈工程师!!!
正文:
这是我用来记录学习算法的一个系列。希望能与所有人共进步。
这个算法小心一点,有点绕脑
/******************************** * * 算法:三色旗 * * 问题: 假设有一条绳子,上面有红、白、蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,您 * 希望将之分类,并排列为蓝、白、红的顺序,要如何移动次数才会最少,注意您只能在绳子上 * 进行这个动作,而且一次只能调换两个旗子。 * * 解决: 在一个绳子上移动,从开头起,以白旗为中心,遇到蓝旗就放白旗左边,红旗放右边。。 * * * * * * ********************************/#include <stdio.h>#include <stdlib.h>#include <string.h>#define Blue 'B'#define White 'W'#define Red 'R'int main(){ char color[] = {'W','R','W','B','W','B','W','R','B','B','W'}; //这是绳子上的旗子们.. //wFlag 表示白旗的位置,bFlag表示蓝旗的位置,rFlag表示红旗的位置,设定白旗和蓝旗从最左边开始,红旗位置从最右边开始 int wFlag = 0,bFlag = 0,rFlag = strlen(color)-1; int i; printf("排序前绳子上的旗子顺序为:"); for(i=0;i<strlen(color);i++) printf("%c ",color[i]); printf("\n"); //排序 //因为最后以白旗为中心,红旗在白旗的右边,所以当白旗的位置还未大于红旗的位置时,表示旗子还没排好 while(wFlag <= rFlag) { if(color[wFlag] == White) //如果是白旗 wFlag++; //则白旗阵营+1,位置向前移后一位 else if(color[wFlag]==Blue) {//如果是蓝旗 swap(&color[bFlag], &color[wFlag]);//则将蓝旗放在白旗左边 wFlag++;bFlag++; //同时分别+1 } else {//如果是红旗 while(wFlag<rFlag && color[rFlag]==Red) //如果最右边这个是红旗,则不用交换旗子的位置 rFlag--; //红旗的位置向前移动一位 swap(&color[rFlag],&color[wFlag]); //此时把前面的红旗和绳子另一端的红旗前一个位置对掉 rFlag--; //此时红旗又向前移动一位 } } printf("排序后绳子上的旗子排序为:"); for(i=0;i<strlen(color);i++) printf("%c ",color[i]); printf("\n"); return 0;}/** * 交换位置函函数 * */ void swap(char* x , char* y) { char temp; temp = *x; *x = *y; *y = temp; }
提示:如果不能很好的理解其中的运算过程,就自己按照给出的解决方法手动排一遍
小尾巴:
吾王剑之所指,即吾等身之所向。 0 0
- [算法系列]三色旗
- 趣味算法-三色旗
- 三色旗算法
- 三色旗算法实现
- 算法思考---------三色旗
- 算法之三色旗
- 三色旗算法
- 三色旗算法
- 算法之三色旗
- 经典算法之三色旗
- 三色旗算法及其C程序
- 从三色旗算法到快速排序
- 榆木脑壳练算法之三色旗问题
- 每日一算法:三色旗问题
- 数据结构经典算法(4)三色旗
- 三色旗算法(C描述)
- 数据结构经典算法学习之三色旗
- 三色旗
- mega328p watchdog 无效解决方案
- 砖籽揍踪足赘醉紫啄字撞族装抓租总壮注
- Log4j配置实践
- 搭建一个wordpress博客的一点感想
- 咻..
- [算法系列]三色旗
- 新的生活——博客记录成长
- Ubuntu14.04--系统中解压rar和zip文件的方法
- HTTP Status Code
- 小波基函数的选择和小波构造
- eclipse中创建web service
- 盒子模型
- 阻拙总纂专兹纵驻左纂专赘撰纂籽罪综啄
- ListView 实现阻尼回弹效果 并去除边缘阴影