C3解决三色旗问题

假设有一条绳子,上面挂有红、白、蓝三种颜色的旗子,没有顺序,每次移动两个旗子,使得颜色顺序为蓝,白红顺序,同时移动次数最少。

 

求解:可以定义一个指针数组,用地址的指向来移动数组内部的值,把蓝色旗子移到数组前面部分,白色旗子移到中间部分,红色旗子移动到数组后面部分,定义开头和结尾分别为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)//遍历到1的情况
15         {
16             swap(array[begin],array[current]);
17             current++;
18             begin++;
19         }
20         else if(array[current]==2)//遍历到2的情况
21         {
22             current++;
23         }
24         else
25         {
26         swap(array[current],array[end]);//遍历到3的情况
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 }

 

posted @ 2022-09-05 20:10  码羊  阅读(61)  评论(0)    收藏  举报