#include<stdio.h> |
#include<stdlib.h> |
#include<string.h> |
#define BLUE 'b' |
#define WHITE 'w' |
#define RED 'r' |
SWAP ( int x, int y ); |
char color[]={ 'r' , 'w' , 'b' , 'w' , 'w' , |
'b' , 'r' , 'b' , 'w' , 'r' , '\0' |
}; |
/* |
三色旗问题 |
假设有一条绳子,上面有红、白、蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,您希望将之分类,并排列为蓝、白、红的顺序,要如何移动次数才会最少,注意您只能在绳子上进行这个动作,而且一次只能调换两个旗子 |
*/ |
int main() |
{ |
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; |
} |
SWAP ( int x, int y ) |
{ |
char temp; |
temp=color[x]; |
color[x]=color[y]; |
color[y]=temp; |
} |