`
pengcc
  • 浏览: 33131 次
  • 性别: Icon_minigender_1
  • 来自: Mars
最近访客 更多访客>>
社区版块
存档分类
最新评论

三色棋解法的C语言实现

阅读更多

三色旗的问题最早由E.W.Dijkstra所提出,他所使用的用语为Dutch Nation Flag(Dijkstra为荷兰人),而多数的作者则使用Three-Color Flag来称之。

假设有一条绳子,上面有红、白、蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,您希望将之分类,并排列为蓝、白、红的顺序,要如何移动次数才会最少,注意您只能在绳子上进行这个动作,而且一次只能调换两个旗子。

 

解法

在一条绳子上移动,在程式中也就意味只能使用一个阵列,而不使用其它的阵列来作辅助,问题的解法很简单,您可以自己想像一下在移动旗子,从绳子开头进行,遇到蓝色往前移,遇到白色留在中间,遇到红色往后移,如下所示:



 

只是要让移动次数最少的话,就要有些技巧:

  1. 如果图中W所在的位置为白色,则W+1,表示未处理的部份移至至白色群组。
  2. 如果W部份为蓝色,则B与W的元素对调,而B与W必须各+1,表示两个群组都多了一个元素。
  3. 如果W所在的位置是红色,则将W与R交换,但R要减1,表示未处理的部份减1。


注意B、W、R并不是三色旗的个数,它们只是一个移动的指标;什么时候移动结束呢?一开始时未处理的R指标会是等于旗子的总数,当R的索引数减至少于W的索引数时,表示接下来的旗子就都是红色了,此时就可以结束移动,如下所示:


 

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; 
}

 

  • 大小: 13.8 KB
  • 大小: 5.2 KB
分享到:
评论

相关推荐

    087 三色球问题 C语言源代码文件

    087 三色球问题 C语言源代码文件

    三色五子棋katago

    五子棋katago(katagomo),有第六颗红棋,三种颜色,自带cuda版三色五子棋引擎和权重,有五子棋katago整合包的要自行替换文件和配置参数

    经典算法全部用C语言实现

    以下算法均用C语言实现,代码可运行 老掉牙 河内塔 费式数列 巴斯卡三角形 三色棋 老鼠走迷官(一) 老鼠走迷官(二) 骑士走棋盘 八个皇后 八枚银币 生命游戏 字串核对 双色、三色河内塔 背包问题...

    c语言经典算法包括老掉牙,汉诺塔,三色旗

    三色棋 老鼠走迷官(一) 老鼠走迷官(二) 骑士走棋盘 八个皇后 八枚银币 生命游戏 字串核对 双色、三色河内塔 背包问题(Knapsack Problem) 数、运算 蒙地卡罗法求 PI Eratosthenes筛选求质数 超长...

    萌式三色围棋M3Go程序(半成品仅贡研究用)

    本程序是我在妙手连珠程序(2004年网冠科技 编著)上修改、编制的萌式三色围棋程序,但目前还属于半成品,还不能实现按规则回合下灰子(花子),而且程序中黑先白后的次序也不知怎么变成了白先黑后。本程序附带有...

    C语言头文件 QOS C语言头文件 QOS

    C语言头文件 QOSC语言头文件 QOSC语言头文件 QOSC语言头文件 QOSC语言头文件 QOSC语言头文件 QOSC语言头文件 QOSC语言头文件 QOSC语言头文件 QOSC语言头文件 QOSC语言头文件 QOSC语言头文件 QOSC语言头文件 QOSC语言...

    C经典算法之三色棋

    三色旗的问题最早由E.W.Dijkstra所提出,他所使用的用语为Dutch Nation Flag(Dijkstra为荷兰人),而多数的作者则使用Three-Color Flag来称之。 假设有一条绳子,上面有红、白、蓝三种颜色的旗子,起初绳子上的旗子...

    Java和C语言实现各种经典算法(含代码图例)

    Java和C语言实现各种经典算法(含代码图例) 老掉牙 河内塔 费式数列 巴斯卡三角形 三色棋 老鼠走迷官(一) 老鼠走迷官(二) 骑士走棋盘 八个皇后 八枚银币 生命游戏 字串核对 双色、三色河内塔 背包...

    C语言经典算法大全.pdf

    三色棋 老鼠走迷官(一) 老鼠走迷官(二) 骑士走棋盘 八个皇后 八枚银币 生命游戏 字串核对 双色 三色河内塔 背包问题(Knapsack Problem) 数 运算 蒙地卡罗法求 PI Eratosthenes筛选求质数 超长...

    萌式三色围棋M3Go程序Release版

    萌式三色围棋M3Go程序Release版

    经典算法(C语言)包含51个经典算法的C语言实现

    4.三色棋 5 5.老鼠走迷官(一) 7 6.老鼠走迷官(二) 9 7.骑士走棋盘 10 8.八皇后 13 9.八枚银币 15 10.生命游戏 17 11.字串核对 20 12.双色、三色河内塔 22 13.背包问题(Knapsack Problem) 26 14.蒙地卡罗法求 ...

    C语言名题精选百则-本书收集了100则C语言程序设计题

    本书收集了100则C语言程序设计题,共分9类。第一类比较简单,主要希望读者了解到本书的题目、解法与其他书籍之间的差异第二至六类分别是关于数字、组合数学或离散数学、查找、排序、字符串等方面的题目;第七类列出...

    经典算法 Java和C语言两种实现

    河内塔 费式数列 巴斯卡三角形 三色棋 老鼠走迷官(一) 老鼠走迷官(二) 骑士走棋盘 八个皇后 八枚银币 生命游戏 字串核对 双色、三色河内塔 背包问题(Knapsack Problem)

    51控制的三色led灯

    51控制的三色led灯,很全的程序哟,很有用的。

    C#编写的三色旗

    在一条绳子上移动,在程式中也就意味只能使用一个阵列,而不使用其它的阵列来作辅助,问题的解法很简单,您可以自己想像一下在移动旗子,从绳子开头进行,遇到蓝色往前移,遇到白色留在中间,遇到红色往后移,如下所...

    三色二叉树

    用c++实现的三色二叉树,能够输出所有的染色方案并求出最多和最少的节点数以及当前的染色方案

    《妙趣横生的算法(C语言实现)》(杨峰 编著)

    《妙趣横生的算法(C语言实现)》可作为算法入门人员的教程,也可以作为学习过C语言程序设计的人士继续深造的理想读物,也可作为具有一定经验的程序设计人员巩固和提高编程水平,查阅相关算法实现和数据结构知识的参考...

    三色棋.zip

    算法是解决特定问题或执行特定任务的一系列步骤或规则的有序集合。在计算机科学中,算法通常用来指导计算机执行特定的任务或解决问题。良好设计的算法能够有效地解决问题,并且在给定的输入下能够产生正确的输出。...

    三国鼎立-三色四子棋游戏(源)

    三色四字棋,附源代码。。三国鼎立-三色四子棋游戏

    C语言经典算法大全

    三色棋 骑士走棋盘 八皇后 八枚银币 生命游戏. 字串核对 背包问题(Knapsack Problem)...........… 蒙地卡罗法求 PI Eratosthenes 筛选求质数 超长整数运算(大数运算) 长PI 最大公因数、最小公倍数、因式分解 ...

Global site tag (gtag.js) - Google Analytics