【原创】CS必修课——C语言基础编程实战29“C语言三色旗问题”-新东方前途出国

您的位置:首页>顾问中心>孔杰>日志>【原创】CS必修课——C语言基础编程实战29“C语言三色旗问题”

欢迎向我提问

*顾问预计24小时内解答,并通过短信方式通知您

留学顾问孔杰

孔杰

活动导师

    获取验证码
    向TA提问

    温馨提示

    您当前咨询的顾问所在分公司为 北京 为您推荐就近分公司 上海 的顾问

    继续向孔杰提问 >
    预览结束
    填写信息下载完整版手册
    获取验证码
    一键解锁留学手册
    在线咨询
    免费评估
    留学评估助力院校申请
    获取验证码
    立即评估
    定制方案
    费用计算
    留学费用计算器
    电话咨询
    预约回电

    顾问将于15分钟内回电

    立即预约
    咨询热线

    小语种欧亚留学
    400-650-0116

    导航

    【原创】CS必修课——C语言基础编程实战29“C语言三色旗问题”

    2020-04-07
    C语言三色旗问题



    有一根绳子,上面有红、白、蓝三种颜色的旗子。绳子上旗子的颜色并没有顺序,现在要对旗子进行分类,按照蓝色、白色、红色的顺序排列。只能在绳子上进行移动,并且一次只能调换两面旗子,怎样移动才能使旗子移动的次数最少?

    算法思想

    旗子在绳子上移动,而且一次只能调换两面旗子,因此只要保证在移动旗子时,从绳子的开头开始,遇到蓝色旗子向前移动,遇到白色旗子则留在中间,而遇到红色的旗子则向后移动。要使移动次数最少,可以使用三个指针 b、w、r 分别作为蓝旗、白旗和红旗的指针。

    若 w 指针指向的当前旗子为白色,则 w 指针增加 1,表示白旗部分增加一面。若 w 指针指向的当前旗子为蓝色,则将 b 指针与 w 指针所指向的旗子交换,同时 b 指针与 w 指针都增加 1,表示蓝旗和白旗部分都多了一个元素。若 w 指针指向的当前旗子为红色,则将 w 指针与 r 指针所指向的旗子交换,同时 r 指针减 1,即 r 指针向前移动,未处理的部分减 1。刚开始时,r 指向绳子中最后一个旗子,之后 r 指针不断前移,当其位于 w 指针之前,即 r 的值小于 w 的值时,全部旗子处理完毕,可以结束比较和移动旗子操作。

    在程序中通过宏定义用大写字母 'B' 'W' 'R' 分别代表蓝色、白色和红色;字符数组 “char color[]”表示绳子上的各种颜色的旗子;旗子移动时通过一个 while 循环判断移动过程是否结束,在 while 循环中根据旗子的不同颜色进行不同的处理。

    程序代码

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <string.h>
    4. #define BLUE 'B'
    5. #define WHITE 'W'
    6. #define RED 'R'
    7. #define swap(x,y){char temp;\
    8. temp=color[x];\
    9. color[x]=color[y];\
    10. color[y]=temp;}
    11.  
    12. int main()
    13. {
    14. char color[]={'R','W','B','W','W','B','R','B','W','R','\0'};
    15. int w=0;
    16. int b=0;
    17. int r=strlen(color)-1;
    18. int i;
    19.  
    20. for(i=0;i<strlen(color);i++)
    21. printf("%c ",color[i]);
    22. printf("\n");
    23. while(w<=r)
    24. {
    25. if(color[w]==WHITE)
    26. w++;
    27. else
    28. {
    29. if(color[w]==BLUE)
    30. {
    31. swap(b,w);
    32. b++;
    33. w++;
    34. }
    35. else
    36. {
    37. while(w<r&&color[r]==RED)
    38. r--;
    39. swap(r,w);
    40. r--;
    41. }
    42. }
    43. }
    44. for(i=0;i<strlen(color);i++)
    45. printf("%c ",color[i]);
    46. printf("\n");
    47. return 0;
    48. }

    调试运行结果

    交换前旗子颜色排列顺序及按顺序最少次数移动旗子后的排列顺序如下所示:

    R W B W W B R B W R
    B B B W W W W R R R

    总结

    在该实例中,分别用语句“int w=0;”“int b = 0;”“int r=strlen(color)-1;”定义并初始化白旗、蓝旗、红旗的指针 w、b、r。在交换不同颜色旗子时,通过旗子的指针实现交换函数 swap 的功能。
    更多详情
    -老师帮忙评估

    自身软实力标化成绩多维度为您评估留学录取率

    立即评估
    推荐阅读 换一换
    提交成功

    稍后会有顾问老师反馈评估结果

    温馨提示

    您当前咨询的 孔杰 顾问,所在分公司为 - ,已为您推荐就近分公司 - 的顾问。

    以下为-分公司顾问:

    继续向孔杰提问