算法分析之三色旗算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法分析之三色旗算法相关的知识,希望对你有一定的参考价值。

一条绳子挂红白蓝三种颜色的旗子,且排列无序,现用程序把三种旗子同色归类,顺序为蓝-白-红,每次只能交换2面旗子,采用最少步骤完成。

算法描述:只需把红色和蓝色的旗子进行交换,红旗和篮旗都就位后,白旗自然就位。

1) 如果白旗所在位置的元素是白旗,表示该位置的元素应该在此,将white++,接着处理下一个旗子;

2) 如果white所在位置的元素是蓝旗,表示需将蓝旗与blue变量所在位置的元素对调,然后使blue++、white++,处理下一个旗子;

3) 如果white所在位置的元素是红旗,表示需要将红旗与red变量的元素对调,然后将red--,继续处理下一旗子。

 

 

 1 namespace section10_threeFlags{
 2 int count;
 3 char color[]="rwbwwbrbwr";
 4 int blue,white,red;
 5 //exchange variable a and b
 6 void swap(char * a, char *b){
 7     char temp;
 8     int i;
 9     temp = *a;
10     *a=*b;
11     *b=temp;
12     count++;
13     printf("the %dth order exchanged\n",count);
14     for(i=0;i<(int)strlen(color);i++){
15             printf("%c ",color[i]);
16     }
17     printf("\n");
18 }
19 void threeFlags(){
20     while(color[white]==b){
21         blue++;
22         white++;
23     }
24     while(color[red]==r){
25         red--;
26     }
27     while(white<=red){
28         if(color[white]==r){
29             swap(&color[white],&color[red]);
30             red--;
31             while(color[red]==r){
32                 red--;
33             }
34         }
35         while(color[white]==w){
36             white++;
37         }
38         if(color[white]==b){
39             swap(&color[white],&color[blue]);
40             blue++;
41             white++;
42         }
43     }
44 }
45 void runThreeFlags(){
46     int i,len;
47     blue=white=0;
48     len=strlen(color);
49     red=len-1;
50     count=0;
51     printf("The original flags‘ array are as follows:\n ");
52     for(i=0;i<len;i++){
53         printf("%c ",color[i]);
54     }
55     printf("\n");
56     threeFlags();
57     printf("The last result :\n");
58     for(i=0;i<len;i++){
59         printf("%c ",color[i]);
60     }
61     printf("\n");
62 }

 

以上是关于算法分析之三色旗算法的主要内容,如果未能解决你的问题,请参考以下文章

经典算法-三色旗

算法--三色排序练习题

三色算法和SATB算法

三色图算法和常数

三色旗

经典算法大全收集51种经典算法 初学者必备