在c++的STL中有函数可以直接对数组元素进行全排列,即next_permutation
和pre_permutation
,这两个函数都可以实现全排列,只是排列的顺序不同,next_permutation作用为向后排序,而pre_permutation作用为向前排序。
需要头文件#include <algorithm>
示例
#include <iostream>
#include <algorithm>
using namespace std;int main() {int nums[10];for( int i = 0; i < 10; i++ ) {nums[i] = i + 1;}int n;cin >> n;do {for( int i = 0; i < n; i++ ) {cout << nums[i];}cout << endl;} while( next_permutation( nums, nums+n ) );return 0;
}
运行结果:
若改为pre_permutation
:
#include <iostream>
#include <algorithm>
using namespace std;int main() {int nums[3] = {3, 2, 1};do {for( int i = 0; i < 3; i++ ) {cout << nums[i];}cout << endl;} while( prev_permutation( nums, nums+3 ) );return 0;
}
#include <iostream>
#include <algorithm>
using namespace std;int main() {int nums[3] = {1, 2, 3}; //注意数据顺序的差异do {for( int i = 0; i < 3; i++ ) {cout << nums[i];}cout << endl;} while( prev_permutation( nums, nums+3 ) );return 0;
}
可见两者的差别为排列顺序不同。
练习
题目链接: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=366
代码:
#include <iostream>
#include <algorithm>
#include <string>
#include <set>
using namespace std;int main() {int nums[10];for( int i = 0; i < 10; i++ ) {nums[i] = i + 1;}int t, n;cin >> t;while( t-- ) {cin >> n;do {for( int i = 0; i < n; i++ ) {cout << nums[i];}cout << endl;} while( next_permutation( nums, nums+n ) );}return 0;
}