这题求解的过程和选择排序非常相似。
反转的过程中分为无序(在前面)和有序(在后面)两个部分,一开始视为全部为无序。
在无序部分中找到最大的元素,先把它翻到最前面,然后再反转到无序部分的最后面。这样该元素就成为有序的部分。
而且在算法执行的过程中不会影响到已经构造好的有序部分。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <string> 3 #include <sstream> 4 #include <algorithm> 5 #include <cstdio> 6 using namespace std; 7 8 const int maxn = 30 + 5; 9 int n, a[maxn]; 10 11 void flip(int p) 12 { 13 for(int i = 0; i < p - i; ++i) swap(a[i], a[p-i]); 14 printf("%d ", n-p); 15 } 16 17 int main() 18 { 19 string s; 20 while(getline(cin, s)) 21 { 22 cout << s << " "; 23 stringstream ss(s); 24 n = 0; 25 while(ss >> a[n]) n++; 26 for(int i = n-1; i > 0; --i) 27 { 28 int p = max_element(a, a+i+1) - a; 29 if(p == i) continue; 30 if(p > 0) flip(p); 31 flip(i); 32 } 33 puts("0"); 34 } 35 36 return 0; 37 }