赞
踩
要求:使用非递归的方法按照字典序输出全排列
思路:
代码实现:
int main(int argc, char* argv[]) { int n = 5; vector<int>s; for (int i = 1; i <= n; i++) s.push_back(i); //以上都是初始化的操作 //其中,n代表n个数字全排列,s用来存储最开始的答案 int len = s.size(); while (true) { print(s);//打印s数组,自己写一个 if (len < 2) break;//如果只有一个元素,就直接退出 int i, j; for (i = len - 1; i > 0; i--) if (s[i - 1] < s[i]) break;//步骤三 if (i == 0)break;//判断是否到头 for (j = len - 1; j > i; j--) if (s[i - 1] < s[j]) break;//步骤四 swap(s[j], s[i - 1]);//步骤五 reverse(s.begin() + i, s.end());//步骤六 } //每次操作之后,都不必恢复,因为原理是找当前排列的下一个排列 }
如果需要逆序输出
因为5的全排列太多了,所以这里是4的全排列
1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
1 4 2 3
1 4 3 2
2 1 3 4
2 1 4 3
2 3 1 4
2 3 4 1
2 4 1 3
2 4 3 1
3 1 2 4
3 1 4 2
3 2 1 4
3 2 4 1
3 4 1 2
3 4 2 1
4 1 2 3
4 1 3 2
4 2 1 3
4 2 3 1
4 3 1 2
4 3 2 1
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。