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; }
相关文章推荐
- 选择Scala的理由?
- 黑马程序员__java基础__网络编程
- epoll 底层实现源码分析
- ios打包IPA的各种问题和解决方法
- SAT词汇备考之(Barrons)巴朗3500基础词汇(List 49)
- 走近云计算
- SeleniumUtil
- oracle sql日期比较
- 30年程序员经验总结
- 日语学习之沪江N3基础 20150624 -5
- [一起学Hive]之二–Hive函数大全-完整版
- 8. String to Integer (atoi)
- C语言的基本输入与输出函数(全解)
- 超出文本省略号显示
- 网页错误404 or 500
- windows 内核对象hash 算法
- GFX游戏引擎衔接文件简述(一)c++代码部分
- bzoj1015 [JSOI2008]星球大战starwar
- 二、Android应用的界面编程(一)界面编程与视图(View)组件
- 20150624 lintcode 总结 Balanced Binary Tree