题意:这个题意紫书描述出了一些问题,题意是给你两种操作,让你从原来的严格升序列变成现在的序列。
操作一:交换最前面的两个数字。
操作二:把最后一个数字放到最前面。
思路:这个题要逆向思维,然后就可以用冒泡的思想。但是一开始这个样子一直都是死循环,后来发现要把首位是n的情况特判。
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <fstream>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
#define MAXN 1010
#define MAXE 210
#define INF 10000000
#define MOD 1000000007
#define LL long long
#define PI acos(-1.0)
using namespace std;
int main() {
std::ios::sync_with_stdio(false);
int n;
while (cin >> n && n) {
deque<int> que;
int arr[MAXN];
for (int i = 0; i < n; ++i) {
cin >> arr[i];
}
for (int i = n - 1; i >= 0; --i) {
que.insert(que.begin(), arr[i]);
}
if (n == 1) {
cout << endl;
} else {
vector<int> vec;
while (true) {
bool flag = true;
for (int i = 0; i < n; ++i) {
if (que[i] != i + 1) {
flag = false;
break;
}
}
if (flag) {
break;
}
if (que[0] == n) {
int temp = que[n - 1];
que.pop_back();
que.push_front(temp);
vec.push_back(2);
} else {
if (que[0] > que[1]) {
swap(que[0], que[1]);
vec.push_back(1);
} else {
int temp = que[n - 1];
que.pop_back();
que.push_front(temp);
vec.push_back(2);
}
}
}
for (int i = vec.size() - 1; i >= 0; --i) {
cout << vec[i];
}
cout << endl;
}
}
return 0;
}
/*
3 2 1 3
3 2 3 1
4 4 2 3 1
0
*/