三色旗问题
来源:互联网 发布:mac 鼠标 触摸板 编辑:程序博客网 时间:2024/05/01 18:46
问题描述
三色旗的问题最早由E.W.Dijkstra所提出,他所使用的用语为DutchNation Flag(Dijkstra为荷兰人),而多数的作者则使用Three-Color Flag来称之。
假设有一条绳子,上面有红、白、蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,您希望将之分类,并排列为蓝、白、红的顺序,要如何移动次数才会最少,注意您只能在绳子上进行这个动作,而且一次只能调换两个旗子。
算法分析
只能在一条绳子上移动,表示不能使用其它的辅助数组。问题的要实现三种旗子的分类,这里我们引入三个变量 bFlag, wFlag, rFlag 做标志
如图所示
变量意义:
其中len表示绳子上旗子总个数, 这里的区间表示的是数组下标或旗子编号(0~len-1)区间
算法流程
用wFlag位置做判断标准,每次进行如下处理:
1. 遇到蓝色旗子,交换wFlag和bFlag位置的旗子,并且wFlag和bFlag都向后移动一个位置
2. 遇到白色旗子,不处理,wFlag向后移动一个位置
3. 遇到红色旗子,交换wFlag和rFlag位置的旗子,rFlag向前移动若干个位置直到为非红色旗子,注意不移动wFlag,因为交换后wFlag位置不一定是白色旗子
C++代码
#include <iostream>#include <algorithm>#include <cstring>using namespace std;int main(){ char color[100]; cin >> color; int bFlag = 0, wFlag = 0, rFlag = strlen(color) - 1; int MinStep = 0; while(wFlag <= rFlag){ if(color[wFlag] == 'b'){ if(bFlag != wFlag){ swap(color[wFlag], color[bFlag]); MinStep ++; } wFlag ++; bFlag ++; } else if(color[wFlag] == 'w'){ wFlag ++; } else{ while(wFlag < rFlag && color[rFlag] == 'r') rFlag --; if(wFlag != rFlag){ swap(color[wFlag], color[rFlag]); MinStep ++; } wFlag ++; } } cout << color << endl; cout << "MinStep = " << MinStep << endl; return 0;}
程序运行结果截图
参考博客, 点击跳转
文章中若有错误纰漏,还望大神批评指正
0 0
- 三色旗问题
- 三色旗问题
- 三色旗问题
- 三色旗排序问题
- 三色旗排序问题
- 三色旗问题
- 三色旗问题
- 三色旗问题
- 三色旗问题
- 三色旗问题
- 三色旗问题
- 三色旗问题
- 三色旗问题
- 三色旗的问题
- 三色旗问题
- 三色旗问题的解决
- Algorithm Gossip:三色旗问题
- 三色问题
- [leetcode] 【数组】70. Climbing Stairs
- MySQL主从复制与读写分离
- MySQL 中间件(Atlas,cobar,TDDL)
- RecyclerView导入到eclipse问题
- win7作为服务器,vm12虚拟机centos6访问win7上的ftp文件夹
- 三色旗问题
- activiti退回到任意节点实例,不支持并行网关
- Linux Shell系列教程之(四)Shell注释
- 64位Ubuntu系统如何运行32位软件
- android input进程(模拟按键)
- 一个神人创造了验证码,又让验证码做出了巨大贡献
- 剑指--重建二叉树
- java导出Excel文件,直接可以下载,然后更新状态,刷新页面
- 关于imageloader的一些理解