假设有一条绳子,上面挂有红、白、蓝三种颜色的旗子,没有顺序,每次移动两个旗子,使得颜色顺序为蓝,白红顺序,同时移动次数最少。
求解:可以定义一个指针数组,用地址的指向来移动数组内部的值,把蓝色旗子移到数组前面部分,白色旗子移到中间部分,红色旗子移动到数组后面部分,定义开头和结尾分别为begin和end
假设蓝色旗子为‘1’,白色旗子为‘2’,红色旗子为‘3’,定义一个整型current用来遍历数组,
遍历情况分为三种
遇到1:交换current和begin,current和begin向后+1
遇到2:不用交换,current+1
遇到3:交换current和end,end向前-1(防止交换之后current值为0,所以current不用+1)
代码如下
1 #include<stdio.h> 2 #define N 10 3 void swap(int &a,int &b)// 4 { 5 int cache=a; 6 a=b; 7 b=cache; 8 } 9 void move(int *array) 10 { 11 int begin=0,end=N-1,current=0; 12 while(current<=end) 13 { 14 if(array[current]==1) 15 { 16 swap(array[begin],array[current]); 17 current++; 18 begin++; 19 } 20 else if(array[current]==2) 21 { 22 current++; 23 } 24 else 25 { 26 swap(array[current],array[end]); 27 end--; 28 } 29 } 30 } 31 int main () 32 { 33 int a[N]={2,2,3,2,1,2,3,2,2,1}; 34 move(a); 35 for(int i=0;i<N;i++) 36 { 37 printf("%d",a[i]); 38 } 39 return 0; 40 }
标签:begin,end,int,三色旗,current,解决,数组,旗子,C3 From: https://www.cnblogs.com/mayang150/p/sanseqi.html