三色旗算法

54 篇文章 1 订阅

三色旗算法

算法描述:

假设有一条绳子,上面有红、白、蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,您希望将之分类,并排列为蓝、白、红的顺序,要如何移动次数才会最少,注意您只能在绳子上进行这个动作,而且一次只能调换两个旗子。示意图:

 

解法:

在一条绳子上移动,在程式中也就意味只能使用一个阵列,而不使用其它的阵列来作辅助,问题的解法很简单,您可以自己想像一下在移动旗子,从绳子开头进行,遇到蓝色往前移,遇到白色留在中间,遇到红色往后移。

 

算法的思想主要是:为了将所有的旗子按照蓝白红排列。

(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; 
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值