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