1.三色旗
说明:
三色旗的问题最早由E.W.Dijkstra所提出,他所使用的用语为Dutch Nation Flag(Dijkstra为荷兰人),而大多数
的作者则使用Three-Color Flag来称之。
假设有一条绳子,上面有红,白,蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,您希望将之分类,并
排列为蓝,白,红的顺序,要如何移动次数才会最少,注意您只能在绳子上进行这份动作,而且一次只能调换
两个色旗子。
2.代码奉上
#include<stdlib.h>
#include<stdio.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[]={'wrbrw'};//初始旗
int wFlag=0;//表示白色旗帜指向的位置
int bFlag=0;//表示蓝色旗帜指向的位置
int rFlag=strlen(color)-1;//表示红色旗帜指向的位置
int i,count=0;
for(i=0;i<strlen(color);i++)
{
printf("%c",color[i]);
}
将初始的旗子🚩显示出来
printf("\n");
while(wFlag<=rFlag)
{if(color[wFlag==WHITE)
{wFlag++;} //如果第wFlag个为白棋,白旗旗帜指向后一位
else if(color[wFlag]==BLUE)
{
swap(bFlag,wFlag);
wFlag++;
bFlag++;
} //如果第wFlag个为蓝棋,蓝旗和白旗位置交换,白旗和蓝旗旗帜指向后一位
else
{while(wFlag<rFlag&&color[rFlag]=RED)
{
rFlag--;//如果rFlag个是红旗,且红旗旗帜大于白旗旗帜,红旗旗帜向前一位
}
swap(rFlag,wFlag);
rFlag--;//红旗和白旗交换且红旗向前一位
}
for(i=0;i<strlen(color);i++)
{printf("%c",color[i]);}
printf("\n");
//显示最后排好的旗
}
return 0;
}
3.举例子
1.wFlag=bFlag=0 rFlag=4
w r b r w \0
2.bFlag=0 rFlag=4
wFlag= 1
w r b r w \0
3. ,bFlag=0 rFlag=3
wFlag=1
w w b r r \0
4 . bFlag=1 rFlag=3
wFlag=2
b w w r r \0