您的位置:首页 > 其它

UVa - 11925 - Generating Permutations

2015-06-24 13:35 330 查看


判断前两个,如果第一个大于第二个(但当第一个等于n,第二个等于1的时候不可以)交换前两个,否则执行操作2的逆操作,把最后一个拿到第一个位置。。。

最后把操作顺序逆着打印出来就OK了。

AC代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cstring>
#include <string>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include <stack>
#include <queue>
#include <bitset>
#include <cassert>
#include <cmath>
#include <functional>

using namespace std;

vector<int> permu, ans;
int  n;

void operate()
{
while (1) {
if (permu[0] == 1) { // 判断是否完成了
bool ok = true;
for (int i = 0; i < n; i++) {
if (permu[i] != i + 1) {
ok = false;
}
}
if (ok) {
return;
}
}

// 注意当第一个大于第二个的时候换,但是如果第一个等于n第二个等于1是不能换的
if (permu[0] > permu[1] && !(permu[0] == n && permu[1] == 1)) {
ans.push_back(1);
swap(permu[0], permu[1]);
}
else {
ans.push_back(2);
permu.insert(permu.begin(), permu[n - 1]);
permu.erase(permu.end() - 1);
}
}
}

int main()
{
ios::sync_with_stdio(false);
while (cin >> n && n) {
int t;
permu.clear();
ans.clear();
for (int i = 0; i < n; i++) {
cin >> t;
permu.push_back(t);
}
operate();
// 逆着输出ans
for (int i = ans.size() - 1; i >= 0; i--) {
cout << ans[i];
}
cout << endl;
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: