Three-Color Flag
问题陈述:
三色旗的问题最早由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的更多相关文章
- Go flag 详解,实现二级子命令
前言 日常开发使用到的命令行工具大都支持如下特性: 文档自动生成(如 -h --help) 多级子命令(如 docker exec -it) 支持参数(如 ls -color=auto) 长短选项(如 ...
- AppCan JSSDK模块扩展
1. 从源码开始: 我们先看源码的8188行到9525行: window.appcan && appcan.define('window',function($,export ...
- HDOJ 2444 The Accomodation of Students
染色判读二分图+Hungary匹配 The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others) Memory Limi ...
- HDOJ 4751 Divide Groups
染色判断二分图+补图 比赛的时候题意居然是反的,看了半天样例都看不懂 .... Divide Groups Time Limit: 2000/1000 MS (Java/Others) Memo ...
- The Accomodation of Students
The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
- GDI+中GIF图片的显示
某位网友曾经问过我GDI+中Gif图像显示的问题,一直没时间给你写,在此致歉.我把这篇文章送给他. 一.GIF格式介绍 1.概述 GIF(Graphics Interchange Format,图形交 ...
- ZOJ 1111 Poker Hands
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1111 A poker hand consists of 5 ca ...
- APPCAN学习笔记004---AppCan与Hybrid,appcan概述
APPCAN学习笔记004---AppCan与Hybrid,appcan概述 技术qq交流群:JavaDream:251572072 本节讲了appcan的开发流程,和开发工具 笔记不做具体介绍了,以 ...
- CSU - 1356 Catch(dfs染色两种写法,和hdu4751比较)
Description A thief is running away! We can consider the city to N–. The tricky thief starts his esc ...
- 验证码识别之w3cschool字符图片验证码(easy级别)
起因: 最近在练习解析验证码,看到了这个网站的验证码比较简单,于是就拿来解析一下攒攒经验值,并无任何冒犯之意... 验证码所在网页: https://www.w3cschool.cn/checkmph ...
随机推荐
- [Math]Reverse Integer
Total Accepted: 111287 Total Submissions: 474471 Difficulty: Easy Reverse digits of an integer. Exam ...
- A - 高精度(大数)N次方(第二季水)
Description Problems involving the computation of exact values of very large magnitude and precision ...
- VirtualBox添加共享文件夹
直接上图 添加了一个名为"Ubuntu10.04-en"的共享文件夹 但是按照它说的命令 mount -t vboxsf share mount_point 打入,然后悲剧了 错误 ...
- Java通过axis调用.NET WebService
前面已经记录过通过axis调用webservice,昨天在对接.NET接口时,发现在传递参数时和一般的传参方法是不一样的,在接口方哥们的帮助下解决了.哈哈. import java.net.URL; ...
- asp.net后台向前端输出js脚本的三种方法
//这个方法最快,因为它会输出到html标签之前 Response.Write("<script type='text/javascript'>alert('这个最快')< ...
- 是一个IPV6地址
每次在VS上调试,发现本机地址是 ::1 这种就不解.由于太忙而没关注,今天看了IPV6的文章才明白.原来这是个IPV6地址,也就是本机环回地址.以前是127.0.0.1,IPV4版本,而IPV6的就 ...
- python成长之路第二篇(4)_collections系列
一.分别取出大于66的数字和小于66的数字 小练习:需求要求有一个列表列表中存着一组数字,要求将大于66的数字和小于66的数字分别取出来 aa = [11,22,33,44,55,66,77,88,9 ...
- Light Bulb--zoj3203(三分法)
Light Bulb Time Limit: 1 Second Memory Limit: 32768 KB Compared to wildleopard's wealthiness, h ...
- (七)boost库之单例类
(七)boost库之单例类 一.boost.serialzation的单件实现 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一 ...
- js调试
在chrome下的调试案例 1.console.log() $("#typeid").change(function(){ var id = $(this).val(); cons ...