三色旗

来源:互联网 发布:怎么把不安全网络 编辑:程序博客网 时间:2024/04/20 21:50

题目:

假设有一条绳子,上面有红、白、蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,您

希望将之分类,并排列为蓝、白、红的顺序,要如何移动次数才会最少,一次只能调换两个旗子。


思路:

将旗子摆成一列,依次遍历

若是蓝色旗子则不动,进行下一次遍历

若是红色旗子则遍历后面的旗子,找到最靠后的一个蓝色旗子,交换

若最后面没有蓝色旗子,则找最靠后的白色旗子,交换

若是白色旗子则遍历后面的旗子,找到最靠后的一个蓝色旗子,交换


在写程序的时候,没有考虑是否交换次数最少,只是交换的时候尽量与最后面的交换,这样就避免了每一次的无用功

代码如下:

写完之后,不太确定是否交换次数最少,于是将答案上的运行后,发现自己的交换次数比答案的少,还疑惑了半天
答案的思路是:

如果W所在的位置为白色,则W+1,表示未处理的部份移至至白色群组。
如果W部份为蓝色,则B与W的元素对调,而B与W必须各+1,表示两个群组都多了一个元素。
如果W所在的位置是红色,则将W与R交换,但R要减1,表示未处理的部份减1。
注意B、W、R并不是三色旗的个数,它们只是一个移动的指标;什幺时候移动结束呢?
一开始时未处理的R指标会是等于旗子的总数,当R的索引数减至少于W的索引数时,表示接下来的旗子就都是红色了,此时就可以结束移动

看懂答案的之后,想看看网上有没有更好的解法,或者说有没有人和思路和我的一样,

于是发现网上的基本都是和答案一样的,才感叹到老师说的天下程序一般抄。

Ps:网上貌似还有个算法思路是:只需将红旗和蓝旗交换,白旗自然到位

0 0