[算法系列]三色旗

写在前面:

     我是一个小小的程序员,我的野心是成为一个全栈工程师!!!


正文:

    这是我用来记录学习算法的一个系列。希望能与所有人共进步。

    这个算法小心一点,有点绕脑


/********************************
 *
 * 算法:三色旗
 *
 * 问题: 假设有一条绳子,上面有红、白、蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,您
 *      希望将之分类,并排列为蓝、白、红的顺序,要如何移动次数才会最少,注意您只能在绳子上
 *      进行这个动作,而且一次只能调换两个旗子。
 *
 * 解决: 在一个绳子上移动,从开头起,以白旗为中心,遇到蓝旗就放白旗左边,红旗放右边。。
 *
 *
 *
 *
 *
 *
 ********************************/

#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;
 }

提示:如果不能很好的理解其中的运算过程,就自己按照给出的解决方法手动排一遍

小尾巴:

    吾王剑之所指,即吾等身之所向。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值