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