三色旗算法
算法描述:
假设有一条绳子,上面有红、白、蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,您希望将之分类,并排列为蓝、白、红的顺序,要如何移动次数才会最少,注意您只能在绳子上进行这个动作,而且一次只能调换两个旗子。示意图:
解法:
在一条绳子上移动,在程式中也就意味只能使用一个阵列,而不使用其它的阵列来作辅助,问题的解法很简单,您可以自己想像一下在移动旗子,从绳子开头进行,遇到蓝色往前移,遇到白色留在中间,遇到红色往后移。
算法的思想主要是:为了将所有的旗子按照蓝白红排列。
(1)设置b和w的指针放在开始,将r指针放在末尾
(2)移动w指针,遇到蓝,则与b指针所指调换顺序,w和b各加1;遇到白,则w+1;遇到红,则与r调换,并且r=r-1
(3)当指针w和r相遇时,结束算法
运行结果示例
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
void swap(char color[],int x,int y)
{
char temp;
temp=color[x];
color[x]=color[y];
color[y]=temp;
}
int main()
{
char color[]={'r','w','b','w','w','b','r','b','w','r','\0'};
//初始化color数组
//数组长度为10,'\0'不算长度
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]=='w') wflag++;
else if(color[wflag]=='b')//通过wflag,bflag模拟指针的作用
{ swap(color,bflag,wflag);
bflag++; wflag++;}
else //此时color[wflag]='r'
{ while((wflag<rflag)&&color[rflag]=='r')
rflag--;//在wflag<rflag时,循环执行
swap(color,rflag,wflag);
//每次交换将红旗放到后边
//最后边的都是红旗
rflag--;}
}
for(i=0;i<strlen(color);i++)
printf(" %c",color[i]);
return 0;
}