荷兰国旗有三横条块构成,自上到下的三条颜色依次为红,白,蓝。现有若干由红,白,蓝三种颜色的条块序列,要将它们重新排列使所有相同颜色的条块在一起。本问题要求将所有红色的条块放在最左边,所有白色的条块放在中间,所有蓝色的条块放在最右边。
方法一:
View Code
#include<iostream> using namespace std; int main(){ char ch[100]; int n; cin>>n; int R,W,B,len; cin.get(); for(int j=0;j<n;j++){ cin.getline(ch,100,'\n'); len=strlen(ch); R=0,W=0,B=0; for(int i=0;i<len;i++){ if(ch[i]=='R') R++; else{ if(ch[i]=='W') W++; else B++; } } for(int i=0;i<R;i++) cout<<"R"; for(int i=0;i<W;i++) cout<<"W"; for(int i=0;i<B;i++) cout<<"B"; cout<<endl; } return 0; }
方法二:思想:
此方法采用特殊的移动方式,分别定于三个指针,p,r,b;
让p从左开始扫描整个序列,开始时,r指向序列的最左端,b指向序列的最右端
始终让r指向红色的最右边,让b指向蓝色的最左边。
步骤:
如果P从左开始扫描中遇到p指向的元素是R(红色),则将此时r指向的元素与p指向的元素交互,然后p++,r++;
如果P从左开始扫描中遇到p指向的元素是B(蓝色),则将此时r指向的元素与p指向的元素交互,然后b--;
如果P从左开始扫描中遇到p指向的元素是W(白色),则p++;
View Code
#include<iostream> using namespace std; void printarray(int size,char A[]){ for(int i=0;i<size;i++) cout<<A[i]; cout<<endl; } int main(){ int b,r,n,len,p,j; char Flag[100]; cin>>n; cin.get(); for(j=0;j<n;j++){ cin.getline(Flag,100,'\n'); len=strlen(Flag); r=0;p=0;b=len-1; while(p<=b){ if(Flag[p]=='R'){ Flag[p]=Flag[r]; Flag[r]='R'; r++;p++; } else{ if(Flag[p]=='B'){ Flag[p]=Flag[b]; Flag[b]='B'; b--; } else p++; } } printarray(len,Flag); } system("pause"); return 0; }