Algorithm-Gossip(4) 三色棋(Three_Color_Flag)

前言

This Series aritcles are all based on the book 《经典算法大全》; 对于该书的所有案例进行一个探究和拓展,并且用python和C++进行实现; 目的是熟悉常用算法过程中的技巧和逻辑拓展。

提出问题

Algorithm Gossip: 三色棋(Three_Color_Flag)

假设数组里面有若干个3种数 (1,2,3)要大的数靠后,小的数靠前,每次只能调换两个数,问怎么移动让次数最少。

原题目:绳子上有三种三色的旗, “蓝白红”按照这个顺序分离,每次换两个旗。方案让最小换的次数。

分析和解释

在一条绳子上移动,在程式中也就意味只能使用一个阵列,而不使用其它的阵列来作辅助,问
题的解法很简单,您可以自己想像一下在移动旗子,从绳子开头进行,遇到蓝色往前移,遇到
白色留在中间,遇到红色往后移,如下所示:
只是要让移动次数最少的话,就要有些技巧:
- 如果图中W所在的位置为白色,则W+1,表示未处理的部份移至至白色群组。
- 如果W部份为蓝色,则B与W的元素对调,而B与W必须各+1,表示两个群组都多了一个元素 。
- 如果W所在的位置是红色,则将W与R交换,但R要减1,表示未处理的部份减1。
注意B、W、R并不是三色旗的个数,它们只是一个移动的指标;什幺时候移动结束呢?一开始
时未处理的R指标会是等于旗子的总数,当R的索引数减至少于W的索引数时,表示接下来的旗
子就都是红色了,此时就可以结束移动

代码

c/c++ 实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BLUE 'b'
#define WHITE 'w'
#define RED 'r'
#define SWAP(x,y) { char temp; \
temp = color[x]; \
color[x] = color[y]; \
color[y] = temp; }
int main()
{char color[] = {'r', 'w', 'b', 'w', 'w','b', 'r', 'b', 'w', 'r', '\0'};int wFlag = 0;int bFlag = 0;int rFlag = strlen(color) - 1;int i;for(i = 0; 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);bFlag++; wFlag++;}else{while(wFlag < rFlag && color[rFlag] == RED)rFlag--;SWAP(rFlag,wFlag);rFlag--;}}for(i = 0; i < strlen(color); i++)printf("%c ", color[i]);printf("\n");return 0;
}

python 实现

def printc(color):for i in range(len(color)):print(color[i],end = "")print()color = ['r', 'w', 'b', 'w', 'w','b', 'r', 'b', 'w', 'r']
wFlag = 0;
bFlag = 0;
rFlag = len(color) - 1printc(color)while(wFlag <= rFlag):if(color[wFlag] == 'w'):wFlag+=1;elif(color[wFlag] == 'b'):color[bFlag],color[wFlag] = color[wFlag],color[bFlag] bFlag+=1; wFlag+=1;else:while(wFlag < rFlag and color[rFlag] == 'r'):rFlag-=1color[rFlag],color[wFlag] = color[wFlag],color[rFlag] rFlag-=1;printc(color)

拓展和关联

有兴趣的可以尝试下,是不是最优解,用动态规划验证下。

后记

可以向dp状态转变。/后面再深究。

参考书籍

  • 《经典算法大全》
  • 维基百科

转载于:https://www.cnblogs.com/actanble/p/6713412.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/488612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能如何推动神经科技发展?

来源 | Forbes作者 | Margaretta Colangelo编译 | 科技行者神经科技以人类神经系统原理为基础&#xff0c;旨在研究人类大脑这一极为复杂的模型架构。在实际作用方面&#xff0c;神经科技将帮助研究人员了解大脑功能与引发功能障碍的原因&#xff0c;并助力医生治疗各类神经系…

tomcat lifecyclelistener_继续,来聊聊Tomcat的容器

作者&#xff1a;不学无数的程序员链接&#xff1a;https://urlify.cn/jYZFFf在这篇文章《Tomcat是如何运行的&#xff1f;整体架构又是怎样的&#xff1f;》中我们简单介绍了容器的概念&#xff0c;并且说了在容器中所有子容器的父接口是Container。在死磕Tomcat系列(2)——En…

java 绘制长方形_Java入门:绘制简单图形

在上一节&#xff0c;我们学习了如何使用swing和awt工具创建一个空的窗口&#xff0c;本节学习如何绘制简单图形。基本绘图介绍Java中绘制基本图形&#xff0c;可以使用Java类库中的Graphics类&#xff0c;此类位于java.awt包中。在我们自己的java程序文件中&#xff0c;要使用…

web面试常见问题补充

jquery Ajax $ajax({ Url:”test.html”,-----发送请求的地址 Async:true;------异步操作 Cache:true,-----可以从缓冲中加载 Type:”GET”,------请求方法 Datatype:”json”,-------服务器返回数据类型 Sucess:function(data){ ----------调用成功语句 If(data”OK”){ Conso…

如何与病毒搏斗?这部BBC“史诗级大片”告诉你答案

来源&#xff1a;惠在湖北 我们知道&#xff0c;在目前没有特效药和疫苗的情况下&#xff0c;被治愈的新型冠状病毒肺炎患者&#xff0c;离不开医学的帮助&#xff0c;而治愈的关键&#xff0c;依靠的是人体自身的免疫力。病毒是如何入侵的&#xff1f;免疫力从何而来&#xff…

单系统 台电x80pro_台电X80 Pro (E6E9)-双系统安装文件平板固件

这是台电X80 Pro (E6E9)-双系统安装文件平板固件&#xff0c;台电X80 Pro (E6E9)出来已经有一段时间了 相信大家都体验到了新机的强大了吧可使用时难免会发生一些意外 比如账户锁密码忘记 手机中毒 使用卡顿 不开机或者开机定屏 无故黑屏等 那怎么解决呢 今天就带大家一起来了解…

Ranklib源码剖析--LambdaMart

Ranklib是一套优秀的Learning to Rank领域的开源实现&#xff0c;其中有实现了MART&#xff0c;RankNet&#xff0c;RankBoost&#xff0c;LambdaMart&#xff0c;Random Forest等模型。其中由微软发布的LambdaMART是IR业内常用的Learning to Rank模型&#xff0c;本文主要介绍…

gentoo linux 分区_小白安装Gentoo Linux操作系统——磁盘分区

磁盘分区规划在日常安装Gentoo Linux操作系统前需要对系统使用的磁盘分区进行规划&#xff0c;规划原则需考虑磁盘容量、系统规模与用途。现阶段个人PC的磁盘容量已近乎TB级别&#xff0c;磁盘容量已不再成为系统安装的约束&#xff0c;那么对系统规模与用途的考虑则是安装Gent…

markdown 行内公式_使用Markdown快速编辑公众号技巧之mdnice

请使用 Chrome 浏览器。请阅读下方文本熟悉工具使用方法&#xff0c;本文可直接拷贝到微信中预览。1 Markdown Nice 简介支持自定义样式的 Markdown 编辑器支持微信公众号、知乎和稀土掘金欢迎扫码回复「排版」加入用户群2 主题https://preview.mdnice.com/themes/欢迎提交主题…

AI人必看!89页全网最全清华知识图谱报告(附PDF)

来源&#xff1a;智东西知识图谱&#xff08;Knowledge Graph&#xff09;是人工智能的重要分支技术&#xff0c;它在2012年由谷歌提出&#xff0c;成为建立大规模知识的杀手锏应用&#xff0c;在搜索、自然语言处理、智能助手、电子商务等领域发挥着重要作用。知识图谱与大数据…

mui.init方法配置

mui框架将很多功能配置都集中在mui.init方法中&#xff0c;要使用某项功能&#xff0c;只需要在mui.init方法中完成对应参数配置即可&#xff0c;目前支持在mui.init方法中配置的功能包括&#xff1a; 创建子页面、 关闭页面、 手势事件配置、 预加载、 下拉刷新、上拉加载、 设…

python wx模块下choice列表框值怎么更新_wx python

一、静态文本控件wx.StaticText(parent, id, label, poswx.DefaultPosition, sizewx.DefaultSize, style0, name"staticText")wx.StaticText构造函数的参数parent&#xff1a;父窗口部件。id&#xff1a;标识符。使用-1可以自动创建一个唯一的标识。label&#xf…

AI战“疫”!人工智能在疫情中的重要作用

来源&#xff1a;腾讯新闻网新冠肺炎疫情牵动着全国人民的心&#xff01;在防控疫情部署落实工作中&#xff0c;上海着力将人工智能等现代信息技术深入应用于疫情态势研判、传播路径分析、精准防控、有效治疗及后续治理等各工作环节。通过提供更加精准有效的科学决策依据&#…

linux 判断指针是否可读_Linux进程间通信——消息队列

概念什么是消息队列&#xff1f;消息队列亦称报文队列&#xff0c;也叫做信箱。是Linux的一种通信机制&#xff0c;这种通信机制传递的数据具有某种结构&#xff0c;而不是简单的字节流。消息队列的本质其实是一个内核提供的链表&#xff0c;内核基于这个链表&#xff0c;实现了…

【人工智能】中科院2019全球人工智能发展白皮书!八大关键技术中国崛起中,国产AI芯片耀眼...

来源&#xff1a;产业智能官人工智能是一个很宽泛的概念&#xff0c;概括而言是对人的意识和思维过程的模拟&#xff0c;利用机器学习和数据分析方法赋予机器类人的能力。人工智能将提升社会劳动生产率&#xff0c;特别是在有效降低劳动成本、优化产品和服务、创造新市场和就业…

斜度符号标注_几何作图之斜度和锥度

虽然机件的形状各有不同&#xff0c;但它们的图样基本上都是由直线、圆弧和其它一些曲线所组成的几何形体。因此在绘图时&#xff0c;常常要运用一些几何作图方法。斜度和锥度1&#xff0e;斜度(GB/T 4458.4-2003)斜度是指一直线(或平面)对另一条直线(或平面)的倾斜程度&#x…

shiro 手动创建session_Shiro 和 spring boot 的集成

1 添加依赖使用 shiro-spring-boot-web-starter 在 spring boot 中集成 shiro 只需要再添加一个依赖<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring-boot-web-starter</artifactId><version>1.4.1</version…

动态规划 所有题型的总结

1 动态规划 1.1 定义 动态规划的核心是状态和状态转移方程。 在记忆化搜索中&#xff0c;可以为正在处理的表项声明一个引用&#xff0c;简化对它的读写操作&#xff1b; 动态规划解决的是多阶段决策问题&#xff1b; 初始状态→│决策&#xff11;│→│决策&#xff12;│→……

mysql事务嵌套 php_使用以下代码,MySQL中的PHP“嵌套”事务是否...

好的,我正在寻找使用PHP在MySQL中进行“嵌套”事务的解决方案,并且正如您在MySQL文档中所知的那样,不可能在事务内进行事务(Mysql transactions within transactions).我试图使用http://php.net/manual/en/pdo.begintransaction.php中建议的Database类,但不幸的是,这对我来说是…

美智库:马赛克战是人工智能与自主系统支撑的决策中心战

来源&#xff1a;国防科技要闻编者按2020年2月11日&#xff0c;美战略与预算评估中心发布报告《马赛克战&#xff1a;利用人工智能和自主系统实施决策中心战》。针对大国战略竞争&#xff0c;报告建议美国防部摒弃当前以消耗战为中心的理念&#xff0c;采用决策中心战。报告分析…