爱嘉牛LA

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

荷兰国旗有三横条块构成,自上到下的三条颜色依次为红,白,蓝。现有若干由红,白,蓝三种颜色的条块序列,要将它们重新排列使所有相同颜色的条块在一起。本问题要求将所有红色的条块放在最左边,所有白色的条块放在中间,所有蓝色的条块放在最右边。

方法一:

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

 

          

posted on 2012-05-11 11:30  爱嘉牛LA  阅读(1101)  评论(0编辑  收藏  举报