每周一算法(4):三色棋

终于来了排序的算法了,但是和普通的排序还有点差异

说明:假设一条绳上有红、白、蓝三种颜色的棋子,按照蓝白红排列,需要移动次数最少,只能在绳子上进行,并且一次只能移动两个。

其实要实现功能很多做法,但是要次数最少,额,那就需要移动有些技巧:

我们需要三个变量例如WFlag,BFlag,RFlag

如果当前位置到了白色,则当前位置W+1

如果到了蓝色,W和B交换位置后,W和B都加1

如果遇到红色,我们需要判断R记录的是否为红色,如果不是红色,则交换位置,R--

 

思想:总结一下,遇到红色,我们需要将红色向后放,遇到蓝色,交换蓝色向前放,三个标志位记录的即位置。

还是模模糊糊,上代码就清楚了

我们肯定需要交换的代码,就不列了,

加入是Swap(A,  B)

核心:

例如:

#define BLUE 'b'
#define WHITE 'w'
#define RED 'r'

char color[] = {'r', 'w', 'b', 'w', 'w', \
                'b', 'r', 'b', 'w', 'r', '\0'};

int wFlag = 0;
int bFlag = 0;
int rFlag = strlen(color) - 1;
int i;

while(wFlag <= rFlag) {
    if(color[wFlag] == WHITE)
    wFlag++;
    else if(color[wFlag] == BLUE) 
    {
        SWAP(bFlag, wFlag);
        bFlag++; wFlag++;
    }
    else 
    {
        while(wFlag < rFlag && color[rFlag] == RED)
        rFlag--;
        SWAP(rFlag, wFlag);
        rFlag--;
    }
}

这种需求也就玩玩

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值