转自:
http://zhangjian110518.blog.163.com/blog/static/74991703200862532221516/
这是一个求一个排序的下一个排列的函数。如果要走遍所有的排列,你必须先排序。这是这两个函数使用需要注意的地方。其函数原形为:
template<class BidIt>
bool next_permutation(BidIt first, BidIt last);
template<class BidIt, class Pred>
bool next_permutation(BidIt first, BidIt last, Pred pr);
而其prev_permutation与之相反,是求一个排列的前一个排序。
下面几个题目是北大OJ上的,这里体现出了STL的优势。(但有时STL效率并不是太高的!)
http://acm.pku.edu.cn/JudgeOnline/problem?id=1146
http://acm.pku.edu.cn/JudgeOnline/problem?id=1256
http://acm.pku.edu.cn/JudgeOnline/problem?id=1833
这是一个求一个排序的下一个排列的函数。如果要走遍所有的排列,你必须先排序。这是这两个函数使用需要注意的地方。其函数原形为:
template<class BidIt>
bool next_permutation(BidIt first, BidIt last);
template<class BidIt, class Pred>
bool next_permutation(BidIt first, BidIt last, Pred pr);
而其prev_permutation与之相反,是求一个排列的前一个排序。
下面几个题目是北大OJ上的,这里体现出了STL的优势。(但有时STL效率并不是太高的!)
http://acm.pku.edu.cn/JudgeOnline/problem?id=1731
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
char ch[205];
cin >> ch;
sort(ch, ch + strlen(ch) );
char *first = ch;
char *last = ch + strlen(ch);
do {
cout << ch << endl;
}while(next_permutation(first, last));
return 0;
}
http://acm.pku.edu.cn/JudgeOnline/problem?id=1146
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
int main()
{
string str;
while(cin >> str && str[0] != '#'){
if( next_permutation(str.begin(), str.end())){
cout << str << endl;
}
else{
cout << "No Successor" << endl;
}
}
return 0;
}
http://acm.pku.edu.cn/JudgeOnline/problem?id=1256
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
int compare(char a, char b)
{
if(tolower(a) == tolower(b))
return a < b;
else return tolower(a) < tolower(b);
}
int main()
{
int len, n;
cin >> n;
char str[15];
cin.ignore();
while(n --) {
cin.getline(str, 15);
len = strlen(str);
sort(str, str + len, compare);
cout << str << endl;
while(next_permutation(str, str + len, compare))
cout << str << endl;
}
return 0;
}
http://acm.pku.edu.cn/JudgeOnline/problem?id=1833
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
int main()
{
int nCases, n, k, i;
int num[1024];
scanf("%d", &nCases);
while(nCases --) {
scanf("%d%d", &n, &k);
for(i = 0; i < n; i++)
scanf("%d", &num[i]);
for(i = 0; i < k; i++)
next_permutation(num, num + n);
for(i = 0;i < n; i++)
printf("%d ", num[i]);
printf("\n");
}
return 0;
}