三色旗解析

 

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

wrbrw\0

 

                                                                                          2.bFlag=0                                                      rFlag=4

                                                                                                                  wFlag= 1 

wrbrw\0

 

                                                                                         3. ,bFlag=0                                         rFlag=3

 

                                                                                                              wFlag=1   

wwbrr\0

 

                                                                                                  4 . bFlag=1                            rFlag=3                  

                                                                                                                 wFlag=2

bwwrr\0

 

 

 

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

需要静养的人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值