问题陈述:

三色旗的问题最早由E.W.Dijkstra所提出,他所使用的用语为Dutch Nation Flag(Dijkstra为荷兰人),而多数的作者则使用Three-Color Flag来称之。

  假设有一条绳子,上面有红、白、蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,您希望将之分类,并排列为蓝、白、红的顺序,要如何移动次数才是最少,注意您只能在绳子上进行这个动作,而且一次只能调换两个旗子。

问题解法:

  在一条绳子上移动,在程式中也就意味着只能使用一个阵列,而不能使用其它的阵列来作辅助,问题的解法很简单,您可以想象一下在移动旗子,从绳子开头进行,遇到蓝色往前移,遇到白色留在中间,遇到红色往后移,如下所示:

  只是要让移动次数最少的话,就要有些技巧:

  如果绳中W(初值为0,作用相当于游标)所在的位置为白色,则W+1,表示未处理的部分移至白色群组,绳子向后走一个旗子。

  如果W部分为蓝色,则B(初值为0,表示蓝色旗子位置)与W的元素对调,而B与W必须各+1,表示两个群组都增加了一个元素。

  如果W所在的位置是红色,则将W与R(初值为绳子上旗子个数,表示红色旗子位置)交换,但R要减1,表示未处理的部分减1。

  如果感觉语言讲述比较抽象,在纸上画出过程,更易理解。

代码详解:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring> #define BLUE 'b'
#define WHITE 'w'
#define RED 'r' using namespace std; void swap(int x, int y, char ch[]) {
char temp;
temp = ch[x];
ch[x] = ch[y];
ch[y] = temp;
} int main()
{
char color[] = {'r', 'w', 'b', 'w', 'w', 'b', 'r', 'b', 'w', 'r', '\0'};
int i;
int wFlag = ;
int bFlag = ;
int rFlag = strlen(color) - ; for(i=; i<strlen(color); i++) {
printf("%c ", color[i]);
}
printf("\n"); while(wFlag <= rFlag) {
if(color[wFlag] == WHITE) {
wFlag++;
}else if(color[wFlag] == BLUE) {
swap(bFlag, wFlag, color);
wFlag++;
bFlag++;
}else {
while(wFlag<rFlag && color[rFlag]==RED) {
rFlag--;
}
swap(wFlag, rFlag, color);
rFlag--;
}
} for(i=; i<strlen(color); i++) {
printf("%c ", color[i]);
}
return ;
}

转载请注明出处:http://www.cnblogs.com/michaelwong/p/4280070.html

Three-Color Flag的更多相关文章

  1. Go flag 详解,实现二级子命令

    前言 日常开发使用到的命令行工具大都支持如下特性: 文档自动生成(如 -h --help) 多级子命令(如 docker exec -it) 支持参数(如 ls -color=auto) 长短选项(如 ...

  2. AppCan JSSDK模块扩展

    1.      从源码开始: 我们先看源码的8188行到9525行: window.appcan && appcan.define('window',function($,export ...

  3. HDOJ 2444 The Accomodation of Students

    染色判读二分图+Hungary匹配 The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others)    Memory Limi ...

  4. HDOJ 4751 Divide Groups

    染色判断二分图+补图 比赛的时候题意居然是反的,看了半天样例都看不懂 .... Divide Groups Time Limit: 2000/1000 MS (Java/Others)    Memo ...

  5. The Accomodation of Students

    The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  6. GDI+中GIF图片的显示

    某位网友曾经问过我GDI+中Gif图像显示的问题,一直没时间给你写,在此致歉.我把这篇文章送给他. 一.GIF格式介绍 1.概述 GIF(Graphics Interchange Format,图形交 ...

  7. ZOJ 1111 Poker Hands

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1111 A poker hand consists of 5 ca ...

  8. APPCAN学习笔记004---AppCan与Hybrid,appcan概述

    APPCAN学习笔记004---AppCan与Hybrid,appcan概述 技术qq交流群:JavaDream:251572072 本节讲了appcan的开发流程,和开发工具 笔记不做具体介绍了,以 ...

  9. CSU - 1356 Catch(dfs染色两种写法,和hdu4751比较)

    Description A thief is running away! We can consider the city to N–. The tricky thief starts his esc ...

  10. 验证码识别之w3cschool字符图片验证码(easy级别)

    起因: 最近在练习解析验证码,看到了这个网站的验证码比较简单,于是就拿来解析一下攒攒经验值,并无任何冒犯之意... 验证码所在网页: https://www.w3cschool.cn/checkmph ...

随机推荐

  1. [Math]Reverse Integer

    Total Accepted: 111287 Total Submissions: 474471 Difficulty: Easy Reverse digits of an integer. Exam ...

  2. A - 高精度(大数)N次方(第二季水)

    Description Problems involving the computation of exact values of very large magnitude and precision ...

  3. VirtualBox添加共享文件夹

    直接上图 添加了一个名为"Ubuntu10.04-en"的共享文件夹 但是按照它说的命令 mount -t vboxsf share mount_point 打入,然后悲剧了 错误 ...

  4. Java通过axis调用.NET WebService

    前面已经记录过通过axis调用webservice,昨天在对接.NET接口时,发现在传递参数时和一般的传参方法是不一样的,在接口方哥们的帮助下解决了.哈哈. import java.net.URL; ...

  5. asp.net后台向前端输出js脚本的三种方法

    //这个方法最快,因为它会输出到html标签之前 Response.Write("<script type='text/javascript'>alert('这个最快')< ...

  6. 是一个IPV6地址

    每次在VS上调试,发现本机地址是 ::1 这种就不解.由于太忙而没关注,今天看了IPV6的文章才明白.原来这是个IPV6地址,也就是本机环回地址.以前是127.0.0.1,IPV4版本,而IPV6的就 ...

  7. python成长之路第二篇(4)_collections系列

    一.分别取出大于66的数字和小于66的数字 小练习:需求要求有一个列表列表中存着一组数字,要求将大于66的数字和小于66的数字分别取出来 aa = [11,22,33,44,55,66,77,88,9 ...

  8. Light Bulb--zoj3203(三分法)

    Light Bulb Time Limit: 1 Second      Memory Limit: 32768 KB Compared to wildleopard's wealthiness, h ...

  9. (七)boost库之单例类

    (七)boost库之单例类 一.boost.serialzation的单件实现 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一 ...

  10. js调试

    在chrome下的调试案例 1.console.log() $("#typeid").change(function(){ var id = $(this).val(); cons ...