• 荷兰国旗问题


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

    方法一:

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

              

  • 相关阅读:
    update语句更新多条记录, 标记下
    点击超链接从VSTF、SVN及文件共享服务器上下载文件
    批量插入数据, 将DataTable里的数据批量写入数据库的方法
    SqlServer规范, 标记下
    学习笔记Mysql操作总结
    今拾到了个联合查询, 琢磨了好几个小时, 标记一下
    【读书笔记】 拜读潘加宇的《软件方法》一书的摘抄(上)
    关于引用类型的 ref 传参操作
    sed 正则表达式处理日志
    各省市个税计算器
  • 原文地址:https://www.cnblogs.com/aijianiula/p/2495687.html
Copyright © 2020-2023  润新知