码迷,mamicode.com
首页 > 编程语言 > 详细

算法分析之三色旗算法

时间:2016-02-22 20:51:23      阅读:297      评论:0      收藏:0      [点我收藏+]

标签:

一条绳子挂红白蓝三种颜色的旗子,且排列无序,现用程序把三种旗子同色归类,顺序为蓝-白-红,每次只能交换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 }

 

算法分析之三色旗算法

标签:

原文地址:http://www.cnblogs.com/hoojjack/p/5208075.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!