荷兰国旗问题

时间限制: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;
}

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

  1. 荷兰国旗 Flag of the Kingdom of the Netherlands

    问题描述:现有n个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左至右的球依次为红球.白球.蓝球.这个问题之所以叫做荷兰国旗,是因为将红白蓝三色的小球弄成条状物,并有序排列 ...

  2. ACM 荷兰国旗问题

    荷兰国旗问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:1   描述 荷兰国旗有三横条块构成,自上到下的三条块颜色依次为红.白.蓝.现有若干由红.白.蓝三种颜色的条块序列,要 ...

  3. July收集荷兰国旗问题之三路partition

    这道题目和分成两块的partition的扩展.比如有一堆0 1 2 数字组成的数组,要分成 00 00  11 1 1  222 2这样的顺序的. 利用lumoto版的partition能够非常好的解 ...

  4. 算法笔记_051:荷兰国旗问题(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 现有n个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左至右的球依次为红球.白球.蓝球.这个问题之所以叫荷兰国旗,是因为 ...

  5. 荷兰国旗问题、快排以及BFPRT算法

    荷兰国旗问题 给定一个数组arr,和一个数num,请把小于num的数放数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边.要求额外空间复杂度O(1),时间复杂度O(N). 这个问题 ...

  6. Coursera Algorithms week2 基础排序 练习测验: Dutch national flag 荷兰国旗问题算法

    第二周课程的Elementray Sorts部分练习测验Interview Questions的第3题荷兰国旗问题很有意思.题目的原文描述如下: Dutch national flag. Given ...

  7. Java实现荷兰国旗问题

    问题描述 现有n个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左至右的球依次为红球.白球.蓝球.这个问题之所以叫荷兰国旗,是因为将红白蓝三色的小球弄成条状物,并有序排列后 ...

  8. 快速排序与荷兰国旗及Partition问题

    快速排序与荷兰国旗及Partition问题 需求: 1.Partition过程 给定一个数组arr,和一个整数num.请把小于等于num的数放在数组的左边,大于num的数放在数组的右边. 要求额外空间 ...

  9. java荷兰国旗问题

    荷兰国旗包含三种颜色:红.白.蓝. 有三种颜色的球,算法的目标是将这三种球按颜色顺序正确地排列.它其实是三向切分快速排序的一种变种,在三向切分快速排序中,每次切分都将数组分成三个区间:小于切分元素.等 ...

随机推荐

  1. POJ 1946 DP

    折腾了一晚上 明天再写.. 2016.5.17 23:59 -> -> #include <cstdio> #include <cstring> #include ...

  2. D - Vanya and Fence

    Problem description Vanya and his friends are walking along the fence of height h and they do not wa ...

  3. inline-block默认间距解决方法

    方法一: 父元素设置font-size: 0;  行内块元素有文字时再在该元素上设置font-size 方法二: 父元素设置word-spacing为负 方法三: Inline-block   元素浮 ...

  4. 打开手机摄像头扫描二维码或条形码全部操作(代码写的不好,请提出指教,共同进步,我只是一个Android的小白)

    (1)下载二维码的库源码 链接:http://pan.baidu.com/s/1pKQyw2n 密码:r5bv 下载完成后打开可以看到 libzxing 的文件夹,最后添加进 Android  Stu ...

  5. React-Router ---withRouter

    import React from 'react' import { withRouter } from 'react-router' const Hello = (props) => { re ...

  6. Django逻辑关系

    title: Django学习笔记 subtitle: 1. Django逻辑关系 date: 2018-12-14 10:17:28 --- Django逻辑关系 本文档主要基于Django2.2官 ...

  7. 【转载】使用JSONObject生成和解析json

    1. json数据类型 类型 描述 Number 数字型 String 字符串型 Boolean 布尔型 Array 数组 Object 对象 null 空值 (1)json中不区分整数.小数等类型, ...

  8. leetcode 188-maxProfit

    public static int maxProfit(int k, int[] prices) { if (0 >= k || null == prices || 1 >= prices ...

  9. 数据类型 scanf标准函数 sizeof关键字 二进制(day03)

    字符类型的名称是char 字符类型里包含256个不同的整数,每个 整数对应一个字符(例如'a', '^'等) 这些整数和字符完全可以互相替代 ASCII码表列出所有整数和字符的对应关系 ASCII码表 ...

  10. 为类型定义取别名、环境变量、静态库与动态库(day03)

    一.为类型命名别名 struct node{ int num; struct node *next; }; typedef struct node node_t; node_t n; 使用typede ...