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

8种机械键盘轴体对比

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

问题描述

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

解题思路

本题就相当于对一堆旗子进行分类,前提是在一条绳子上,分类的结果就是绳子分为三部分,分别为红白蓝三种颜色。这个问题让我想起了快排时用到的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;

}

8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 问题描述 假设有一根绳子,上面有红、白、蓝三种颜色的旗子,起初绳子上的旗子并没有顺序,现在需要将它们分类,并排列为蓝红白的顺序,要如何移动次数才会最少,注意您只能在绳子上进行此动作,并且一次只能调换两个旗子。 解题思路 本题就相当于对一堆旗子进行分类,前提是在一条绳子上,分类的结果就是绳子分为三部分,分别为红白蓝三种颜色。这个问题让我想起了快排时用到的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; }
经验分享 程序员 微信小程序 职场和发展