NYOJ_268_荷兰国旗问题

荷兰国旗问题

时间限制:3000 ms  |  内存限制:65535 KB

难度:1

描写叙述

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

输入

第1行是一个正整数n(n<100),表示有n组測试数据。接下来有n行,每行有若干个由R,W,B三种字符构成的字符串序列,当中R,W和B分别表示红、白、蓝三种颜色的条块,每行最多有1000个字符。

输出

对输入中每行上由R。W。B三种字符构成的字符串序列。将它们又一次排列使全部同样颜色的条块在一起,满足前述要求。

例子输入

3
BBRRWBWRRR
RRRWWRWRB
RBRW

例子输出

RRRRRWWBBB
RRRRRWWWB
RRWB

分析:荷兰国旗问题是一个经典的题目。由于仅仅涉及到三种颜色。所以我们能够把红、白、蓝分别用1、2、3三个数字取代。能够把它看做是数组排序问题,而数组元素的值为1、2、3三种。

排好序后数组肯定分为三块区域,前部为1,中部为2,后部为3。如今我们的思路就是把未排序时前部和后部分别排在数组的前面和后面。那么中部自然就排好了。

设置两个标志位head指向数组开头。tail指向数组末尾,now从头開始遍历:

(1)假设遍历到的位置为1。那么它一定是属于前部。于是就和head交换值,然后head++,now++;

(2)假设遍历到的位置为2,说明属于中部,now++;

(3)假设遍历到的位置为3,说明属于后部,于是就和tail交换值,然而。假设此时交换后now指向的值属于前部,那么就运行(1),tail--;

事实上这个题目假设仅仅是解题的话全然不要这样子做,直接计算红、白、蓝三种颜色的数量。然后输出就可以。

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=268

代码清单:

#include<iostream>
#include<algorithm>
using namespace std;

const int maxn = 100 + 5;

int n;
string str;
int main(){
    cin>>n;
    while(n--){
        cin>>str;
        int len=str.size();
        int now=0,ans=0;
        int head=0,tail=len-1;
        while(now<=tail){
            if(str[now]==‘R‘){
                swap(str[head],str[now]);
                head++;
                now++;
            }
            else if(str[now]==‘W‘){
                now++;
            }
            else{
                swap(str[now],str[tail]);
                tail--;
            }
        }
        cout<<str<<endl;
    }return 0;
}
#include<iostream>
using namespace std;
int main(){
    int n;
    cin>>n;
    string s="RWB";
    while(n--){
        string str;
        cin>>str;
        int ans[3]={0};
        int len=str.size();
        for(int i=0;i<len;i++){
            if(str[i]==‘R‘) ans[0]++;
            else if(str[i]==‘W‘) ans[1]++;
            else ans[2]++;
        }
        for(int i=0;i<3;i++){
            for(int j=0;j<ans[i];j++){
                cout<<s[i];
            }
        }cout<<endl;
    }return 0;
}
时间: 2024-10-14 05:55:33

NYOJ_268_荷兰国旗问题的相关文章

荷兰国旗问题

荷兰国旗问题: 现有红,白,蓝三个不同颜色的小球,乱序排列在一起,重新排列这些小球,使得红白蓝三色的同颜色的球在一起. 问题分析: 问题转换为:给定数组A[0,1,...,N-1],元素只能取0,1,2三个值,设计算法使得数组重新排列成“000...111..222”的形式. 可以使用三个游标,begin=0,cur=0,end=N-1. 程序实现: 1 /*************************************** 2 FileName HollandFlag.cpp 3 A

荷兰国旗问题 划分成3部分 leecode

1 public class Solution { 2 public void sortColors(int[] A) { 3 int len=A.length; 4 int beg=0; 5 int end=len-1; 6 int cur=0; 7 while(cur<=end){ 8 if(A[cur]==0) 9 { 10 swap(A,cur,beg); 11 beg++; 12 cur++; 13 14 15 } 16 else if(A[cur]==1) 17 { 18 cur++

快速排序深入之荷兰国旗问题

一.序言 在使用partition-exchange排序算法时,如快速排序算法(即使选择了一个好的关键元素pivot values),我们往往面临一个很尴尬的境地--当排序对象中有很多重复的元素,partition-exchange排序算法表现很不尽如人意.当所有元素都相等时,这就特别容易理解了.在每次递归中,左边部分是空的(没有元素比关键元素小),而右边部分只能一个一个递减移动.结果导致耗费了二次方时间来排序相等元素.为了解决这个问题(有时叫做荷兰国旗问题),我们详细介绍下解决这个问题的方法.

荷兰国旗问题:

何谓荷兰国旗: 现有红.白.蓝三个不同颜色的小球,乱序排列在一起,请重新排列这些小球,使得红白蓝三色的同颜色的球在一起.这个问题之所以叫荷兰国旗,是因为我们可以将红白蓝三色小球想象成条状物,有序排列后正好组成荷兰国旗. 问题转换为:给定数组A[0…N-1],元素只能取0.1.2三个值,设计算法,使得数组排列成“00…0011…1122…22”的形式. 借鉴快速排序中partition的过程.定义三个指针:begin=0.current=0.end=N-1: A[cur]==2,则A[cur] 与

[算法系列之十一]荷兰国旗问题

[问题] 现有红白蓝三个不同颜色的小球,乱序排列在一起,请重新排列这些小球,使得红白蓝三色的同颜色的球在一起.这个问题之所以叫荷兰国旗问题,是因为我们可以将红白蓝三色小球想象成条状物,有序排列后正好组成荷兰国旗. [分析] 这个问题我们可以将这个问题视为一个数组排序问题.红白蓝分别对应数字0.1.2.红.白.蓝三色小球数量并不一定相同. [思路一] First, iterate the array counting number of 0's, 1's, and 2's, then overwr

荷兰国旗 Flag of the Kingdom of the Netherlands

问题描述:现有n个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左至右的球依次为红球.白球.蓝球.这个问题之所以叫做荷兰国旗,是因为将红白蓝三色的小球弄成条状物,并有序排列后正好组成荷兰国旗. 解题方法1:蛮力求解 解题方法2:为了讨论方便用数字0表示红色球,用数字1表示白色球,用数字2表示蓝色球,所以最后的排序就是0...1...2... 快速排序基于划分过程,选取主元间整个数组划分为两个子数组.是否可以借鉴划分过程设定三个指针完成一次遍历完成重新排列,使得所有的球

荷兰国旗

题目描述 拿破仑席卷欧洲大陆之后,代表自由,平等,博爱的竖色三色旗也风靡一时.荷兰国旗就是一面三色旗(只不过是横向的),自上而下为红白蓝三色. 该问题本身是关于三色球排序和分类的,由荷兰科学家Dijkstra提出.由于问题中的三色小球有序排列后正好分为三类,Dijkstra就想象成他母国的国旗,于是问题也就被命名为荷兰旗问题(Dutch National Flag Problem). 下面是问题的正规描述: 现有n个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左至右

编程之法:面试和算法心得(荷兰国旗)

内容全部来自编程之法:面试和算法心得一书,实现是自己写的使用的是java 题目描述 拿破仑席卷欧洲大陆之后,代表自由,平等,博爱的竖色三色旗也风靡一时.荷兰国旗就是一面三色旗(只不过是横向的),自上而下为红白蓝三色. 该问题本身是关于三色球排序和分类的,由荷兰科学家Dijkstra提出.由于问题中的三色小球有序排列后正好分为三类,Dijkstra就想象成他母国的国旗,于是问题也就被命名为荷兰旗问题(Dutch National Flag Problem). 下面是问题的正规描述: 现有n个红白蓝

八大基本排序---快速排序(荷兰国旗问题)

引言: 解答: 需要准备3个下标 如果当前数字=num,cur跳下一个 如果数组中的当前数字<num,把这个数(3)和小于区域的下一个数(5)交换 然后小于区域扩一下 然后cur跳下一个位置 数组中的当前数字<num,把这个数(2)和小于区域的下一个数(5)交换, 然后小于区域扩一下 然后cur跳下一个位置 PS: 如果一上来遇到的就是cur<num 把这个数(3)和小于等于区域的下一个数(3)交换[自己和自己交换] 数组中的当前数字>num,把这个数(7)和大于区域的前一个数(x