题目
解答
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*'B' 'W' 'R' 分别代表蓝色、白色和红色*/
#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;\
}
void main(){
char color[]={'R','W','B','W','W','B','R','B','W','R','\0'}; /*绳子上的各种颜色的旗子*/
int w=0; /*初始化白旗的指针指向color[0]*/
int b=0; /*初始化蓝旗的指针指向color[0]*/
int r=strlen(color)-1; /*初始化红旗的指针指向color[9]*/
int i;
for(i=0;i<strlen(color);i++) /*打印出最初的颜色次序*/
printf("%c ",color[i]);
printf("\n");
/*对旗子进行分类,按照蓝色、白色、红色的顺序排列*/
while(w<=r){ /*当w未超过r时*/
if(color[w]==WHITE) /*w遇到白旗,w向后走一位*/
w++;
else{
if(color[w]==BLUE){ /*w遇到蓝旗,将蓝旗交换到前面*/
swap(b,w);
b++; /*b向前走一步*/
w++; /*w向前走一步*/
}
else{ /*w指向的不是白旗也不是蓝旗,只能是红旗*/
while(w<r&&color[r]==RED) /*若r是红旗,则向前走,找到首个不是红旗的位置【此处若w==r,说明二者相遇,r不动】*/
r--;
swap(r,w); /*将w处的红旗与r处不是红旗的那个旗互换,将红旗交换到后面*/
r--; /*r再向前走一步,w则没有动*/
}
}
}
for(i=0;i<strlen(color);i++)/*打印出排好序的颜色次序*/
printf("%c ",color[i]);
printf("\n");
}