Sorting a Three-Valued Sequence chapter 2.1

  大概思路:fin读取时记录1,2,3对应个数,然后从buf[1]开始,枚举遍历。1,2,3最终位置和是由count[1..2..3]形成的3个区间,若buf[i]再对应区间,则continue;若不再,则遍历最终位置所在的区间,寻找是否存在两数交换恰好后都在最终位置的index,若有,交换,若无,随意选择一处交换,每次交换step++;又是一次ac,,^_^o~ 努力!

  1 /*
  2 
  3 ID: hubiao cave
  4 
  5 PROG: sort3
  6 
  7 LANG: C++
  8 
  9 */
 10 
 11 
 12 
 13 
 14 #include<iostream>
 15 
 16 #include<fstream>
 17 
 18 #include<string>
 19 
 20 using namespace std;
 21 
 22 
 23 int number;
 24 int buf[1002];
 25 int cou[4];
 26 int step;
 27 
 28 void proc();
 29 int swapdir(int index,int value);
 30 int swap(int&,int&);
 31 
 32 int main()
 33 
 34 {
 35 
 36 
 37 
 38 
 39     ifstream fin("sort3.in");
 40 
 41     ofstream fout("sort3.out");
 42     fin>>number;
 43     for(int i=1;i<=number;i++)
 44     {
 45         fin>>buf[i];
 46         cou[buf[i]]++;
 47     }
 48     proc();
 49     fout<<step<<endl;
 50 
 51     return 0;
 52 
 53 
 54 }
 55 void proc()
 56 {
 57     for(int i=1;i<=number;i++)
 58     {
 59         if(buf[i]==1)
 60         {
 61             if(i<=cou[1])
 62                 continue;
 63             else
 64             {
 65                 swapdir(i,1);
 66             }
 67         }
 68         if(buf[i]==2)
 69         {
 70             if(i<=cou[2]+cou[1]&&i>cou[1])
 71                 continue;
 72             else
 73                 swapdir(i,2);
 74         }
 75         if(buf[i]==3)
 76         {
 77             if(i<=cou[1]+cou[2]+cou[3]&&i>cou[1]+cou[2])
 78                 continue;
 79             else
 80                 swapdir(i,3);
 81         }
 82     }
 83 }
 84 
 85 int swapdir(int index,int value)
 86 {
 87     if(value==1)
 88     {
 89         int imper=0;
 90         int pernum;
 91         pernum=index>cou[2]+cou[1]?3:2;
 92 
 93 
 94         for(int i=1;i<=cou[1];i++)
 95         {
 96             if(buf[i]==1)
 97                 continue;
 98             else
 99             {
100                 if(buf[i]==pernum)
101                 {
102                     swap(buf[i],buf[index]);
103                     step++;
104                     return 0;
105                 }
106                 else
107                 {
108                     imper=i;
109                 }
110 
111             }
112         }
113         swap(buf[imper],buf[index]);
114     }
115 
116     if(value==2)
117     {
118         int imper=0;
119         int pernum;
120         pernum=index<=cou[1]?1:3;
121         for(int i=cou[1]+1;i<=cou[1]+cou[2];i++)
122         {
123             if(buf[i]==2)
124                 continue;
125             else
126             {
127                 if(buf[i]==pernum)
128                 {
129                     swap(buf[i],buf[index]);
130                     step++;
131                     return 0;
132                 }
133                 else
134                 {
135                     imper=i;
136                 }
137 
138             }
139         }
140         swap(buf[imper],buf[index]);
141     }
142 
143     if(value==3)
144     {
145         int imper=0;
146         int pernum;
147         pernum=index<=cou[1]?1:2;
148         for(int i=cou[1]+cou[2]+1;i<=cou[1]+cou[2]+cou[3];i++)
149         {
150             if(buf[i]==3)
151                 continue;
152             else
153             {
154                 if(buf[i]==pernum)
155                 {
156                     swap(buf[i],buf[index]);
157                     step++;
158                     return 0;
159                 }
160                 else
161                 {
162                     imper=i;
163     
164                 }
165 
166             }
167         }
168         swap(buf[imper],buf[index]);
169     }
170     step++;
171     return 0;
172 }
173 
174 int swap(int& a,int& b)
175 {
176     int t=a;
177     a=b;
178     b=t;
179     return 0;
180 }
原文地址:https://www.cnblogs.com/cavehubiao/p/3277861.html