1.问题描述
假设有一条绳子,上面有红、白、蓝三种颜色的旗子。开始时绳子
上旗子的颜色并没有顺序,现在要对旗子进行分类,并按照蓝、白、红
的顺序排列。需要注意的是只能在绳子上进行移动,并且一次只能调换
两个旗子,则如何移动才能使旗子移动的次数最少。
2.问题分析
由问题描述可知,只在一条绳子上移动,而且一次只能调换两个旗
子,因此只要保证在移动旗子时,从绳子的开头开始,遇到蓝色的旗子
向前移,遇到白色的旗子留在中间,而遇到红色的旗子则向后移。如果
要让移动次数最少,则可以使用三个标记b、w、r来分别标记蓝旗、白旗
和红旗。
3.算法设计
整个绳子可以分为三个部分,蓝旗部分、白旗部分和红旗部分,在
排序未完成时,还有未处理部分,如图12.6所示。
如果w标记的当前旗子为白色,图12.6中阴影部分为w标记当前所指
向的旗子,则w标记增1,表示白旗部分增1。
如果w标记的当前旗子为蓝色,则将b标记与w标记所指向的旗子交
换,同时b标记与w标记都增1,表示蓝旗部分与白旗部分都多了一个元
素。
如果w标记的当前旗子为红色,则将w标记与r标记所指向的旗子交
换,同时r标记减1,即r标记前移,表示未处理的部分减1。

开始时,r指向绳子中最后一个旗子,之后r标记不断前移,当其位于
w标记之前时,即r值小于w值时,全部旗子处理完毕,可以结束比较和 

4.确定程序框架
(1)定义字符数组
定义字符数组表示绳子上的各个旗子的颜色,用大写字母R、W和B
分别代表红色、白色和蓝色。

color = ['R', 'W', 'B', 'W', 'W', 'B', 'R', 'B', 'W', 'R'] #定义字符数组

2)标记移动和交换旗子
移动时需要通过一个while循环来判断移动过程是否结束,在while循
环体中根据旗子的不同颜色进行不同的处理。
移动过程的核心代码如下:

# 移动过程
while w <= r:
# 遇到的是白旗
if color[w] == WHITE:
w += 1 # 白旗指针自增1
# 遇到的是蓝旗
elif color[w] == BL?E:
SWAP(b, w) # 交换蓝旗指针和白旗指针所指向的旗子
b += 1 # 蓝旗指针自增1
w += 1 # 白旗指针自增1
# 遇到的是红旗
else:
# 移动红旗指针使其指向当前最靠前的非红旗位置
while w < r and color[r] == RED:
r -= 1 # 红旗指针自减1
SWAP(r, w) # 交换红旗指针和白旗指针所指向的旗子颜色
r -= 1 # 红旗指针自减1

程序流程图如图12.7所示。

5.完整的程序
根据上面的分析,编写程序如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @author : liuhefei
# @desc: 三色旗
#交换旗子
def SWAP(x,y):
temp=color[x]
color[x]=color[y]
color[y]=temp
if __name__ == '__main__':
WHITE = 'W'
RED = 'R'
BL?E = 'B'
color = ['R', 'W', 'B', 'W', 'W', 'B', 'R', 'B', 'W', 'R']
#定义字符数组
w, b, r = 0, 0, len(color)-1
# 打印出移动前绳子上旗子的颜色
for i in range(len(color)):
print(color[i], end=' ')
print()
# 移动过程
while w <= r:
# 遇到的是白旗
if color[w] == WHITE:
w += 1 # 白旗指针自增1
# 遇到的是蓝旗
elif color[w] == BL?E:
SWAP(b, w) # 交换蓝旗指针和白旗指针所指向的旗子
b += 1 # 蓝旗指针自增1
w += 1 # 白旗指针自增1
# 遇到的是红旗
else:
# 移动红旗指针使其指向当前最靠前的非红旗位置
while w < r and color[r] == RED:
r -= 1 # 红旗指针自减1
SWAP(r, w) # 交换红旗指针和白旗指针所指向的旗子颜色
r -= 1 # 红旗指针自减1
# 打印出移动后绳子上旗子的颜色
for i in range(len(color)):
print(color[i], end=' ')
print()

6.运行结果
在PyCharm下运行程序,结果如图12.8所示。
由运行结果可见,程序执行后,绳子上三种颜色的旗子已经按照
蓝、白、红的顺序排列了。

100个python算法超详细讲解:三色旗相关推荐

  1. 100个python算法超详细讲解:搬山游戏

    [100个python算法超详细讲解]@谷歌学术 1.问题描述 设有n座山,计算机与人作为比赛的双方,轮流搬山.规定每次搬 山数不能超过k座,谁搬最后一座谁输.游戏开始时,计算机请人输入 山的总数n和 ...

  2. 100个python算法超详细讲解:平分7筐鱼

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 2.乙.丙三位渔夫出海打鱼,他们随船带了21只箩筐.当晚返航时, 他们发现有7筐装满了鱼,还有7筐装了半筐鱼,另外7筐是空的,由于他们 ...

  3. 100个python算法超详细讲解:邮票组合

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 我们寄信都要贴邮票,在邮局有一些小面值的邮票,通过这些小 面值邮票中的一张或几张的组合,可以满足不同邮件的不同邮资.现 在,邮局有4种不 ...

  4. 100个python算法超详细讲解:递归解决年龄问题

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁.问 第4个人多少岁,他说比第3个人大2岁.问第3人多少岁,他说比第2个 人大2 ...

  5. 100个python算法超详细讲解:谁是窃贼

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 警察审问4名窃贼嫌疑犯.现在已知,这4人当中仅有一名是窃 贼,还知道这4个人中的每个人要么是诚实的,要么总是说谎. 下面是这4个人给警察 ...

  6. 100个python算法超详细讲解:抢30游戏

    [100个python算法超详细讲解]@谷歌学术 1.问题描述 由两个人玩"抢30"游戏,游戏规则是:第一个人先说"1"或"1,2",第 二 ...

  7. 100个python算法超详细讲解:卡布列克常数

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 对于任意一个4位数n,进行如下的运算: 1)将组成该4位数的4个数字由大到小排列,形成由这4个数字构 成的最大的4位数. 2)将组成该4 ...

  8. 100个python算法超详细讲解:孪生素数

    [100个python算法超详细讲解@谷哥技术] 1.问题描述 本节要研究孪生素数的问题,先来看看什么是孪生素数. 所谓孪生素数指的是间隔为2的两个相邻素数,因为它们之间的距离已经 近得不能再近了,如 ...

  9. 100个python算法超详细讲解:狼追兔子

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 一只兔子躲进了10个环形分布的洞中的某一个.狼在第一个洞中 没有找到兔子,就隔一个洞,到第三个洞中去找:如果没有找到,就 隔两个洞,到第 ...

  10. 100个python算法超详细讲解:猴子吃桃

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 一个猴子摘了一些桃子,它第一天吃掉了其中的一半然后再多吃了 一个,第二天照此方法又吃掉了剩下桃子的一半加一个,以后每天如 此,直到第十天 ...

最新文章

  1. 能带曲线图绘制python_如何使用python的matplotlib模块画折线图
  2. 姚班系创业公司宸镜科技再获新融资,漆子超、陈启峰联手,OPPO入股加持“元宇宙”概念要火?...
  3. Rails 应用使用 Capistrano2 部署流程
  4. Java中使用ArrayList的10个示例–教程
  5. Django中的class Meta知识点
  6. 【ElasticSearch】Es 源码之 AnalysisModule 源码解读
  7. java 返回页面_spring-mvc返回视图jsp页面及重定向
  8. linux服务器centos空间满的检查及解决方法
  9. 从 VMWare 到阿里神龙,虚拟化技术 40 年演进史
  10. 学游戏设计要什么学历_学平面设计有学历限制吗?
  11. git常用命令及手动关联git本地和远端仓库
  12. 前馈电容的作用-DCDC
  13. Android前景怎么样、是不是要凉了、是不是应该考虑要转行?看完你就知道
  14. python龙旋风图形代码_python – 无法使用gunicorn运行龙卷风应用程序
  15. 初中信息技术面试计算机网络,2019下半年中学信息技术教师资格面试真题完整版...
  16. 如何删除MacOS自带的输入法的自造词(Catalina)
  17. 获取referer中的请求参数_javaweb之request获取referer请求头实现防盗链
  18. 根据value值动态的设置checkbox选中状态
  19. 港科夜闻丨香港科大与迅雷建立联合实验室,共同推动区块链科技创新与应用...
  20. 校外培训机构被叫停,中止营业,这属于营业中断险的保障范围吗?

热门文章

  1. python的合法命名,以下不是Python语言合法命名的是:A、MyGod5B、5MyGodC、_...
  2. innosetup 通过操作注册表来添加默认文件关联
  3. ttl传输种过期_TTL 传输中过期2、目标主机无法访问3、请求超时4、未知主机
  4. 大型传统企业要不要提升自身的IT研发能力
  5. 线性代数系列讲解第七篇 正交向量及正交空间
  6. c语言课程设计 雪花飘落,c雪花飘落课程设计.doc
  7. 酷派系列手机root后怎么恢复文件
  8. u3d快速入门图文教程
  9. 二、Win10如何解决svchost一直占用网速和内存?
  10. ArcGIS重装之旧软件卸不干净的问题