若 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 循环中根据旗子的不同颜色进行不同的处理。程序代码
#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','R',''}; int w=0; int b=0; int r=strlen(color)-1; int i; for(i=0;i<strlen(color);i++) printf("%c ",color[i]); printf("\n"); while(w<=r) { if(color[w]==WHITE) w++; else { if(color[w]==BLUE) { swap(b,w); b++; w++; } else { while(w<r&&color[r]==RED) r--; swap(r,w); r--; } } } for(i=0;i<strlen(color);i++) printf("%c ",color[i]); printf("\n"); return 0;}调试运行结果交换前旗子颜色排列顺序及按顺序最少次数移动旗子后的排列顺序如下所示:
R W B W W B R B W R
B B B W W W W R R R
以上是内存溢出为你收集整理的C语言三色旗问题全部内容,希望文章能够帮你解决C语言三色旗问题所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)