c语言解三色旗问题加注释,三色旗问题(Three

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

问题描述

三色旗的问题最早由E.W.Dijkstra所提出,他所使用的用语为Dutch Nation Flag(Dijkstra是荷兰人),而多数作者则使用Three-Color Flag 来称之。

假设有一根绳子,上面有红、白、蓝三种颜色的旗子,起初绳子上的旗子并没有顺序,现在需要将它们分类,并排列为蓝红白的顺序,要如何移动次数才会最少,注意您只能在绳子上进行此动作,并且一次只能调换两个旗子。

解题思路

本题就相当于对一堆旗子进行分类,前提是在一条绳子上,分类的结果就是绳子分为三部分,分别为红白蓝三种颜色。这个问题让我想起了快排时用到的partition算法,就是将数分为两类,左边比x小,右边比x大。这里也可以用类似的方法,就是将整个数组分为三大块,维护三个下标就可以了。

算法描述:

用B,W,R三个下标作为标签分类,B=W=0,R=n-1,当w>R结束。若w为白色,w++;

若w为蓝色,交换W与B处的值,w++,B++;

若W为红色,交换W与R处的值,W不变,R—;

注意:W始终为待处理的旗子,B始终是蓝色旗子最后一个的下一个,即白色旗子 的第一个,R始终为从右边数完所有处理完的红色旗子后的第一个未处理的旗子。

代码实现#include

using namespace std;

#define swap(t,x,y){t _z;_z=y;y=x;x=_z;}

void Sequence(char *a,int n){

int num=0; //step

int low=0,mid=0,high=n-1;

while(mid<=high){

if(a[mid]=='W')

mid++;

else if(a[mid]=='B'){

swap(char,a[mid],a[low]);

mid++;low++;num++; //a[low] has been checked, mid++

}

else{

swap(char,a[mid],a[high]);

num++;high--; //a[high] has not been checked

}

}

cout<2?" steps":" step")<

}

int main(){

char a[10]={'W','B','B','R','R','W','R','B','W','B'};

Sequence(a,10);

for(int i=0;i<10;i++)

cout<

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值