全排列函数 : next_permutation and prev_permutation
2014-07-18 09:21
330 查看
以前需要写全排列的时候都是自己写的dfs或者用几个for搞定,忽然听到有人说有生成全排列的库函数,然后去问度娘,
找到了 next_permutation and prev_permutation这两货,写一篇CSDN加深印象吧。(ps:有部分内容来自网络,大牛们别介意啊)
template<class BidirectionalIterator>
bool next_permutation(
BidirectionalIterator _First,
BidirectionalIterator _Last
);
template<class BidirectionalIterator, class BinaryPredicate>
bool next_permutation(
BidirectionalIterator _First,
BidirectionalIterator _Last,
BinaryPredicate _Comp
);
据说这是next_permutation的函数原型,菜鸟看不懂,先感受一下。
先掌握用法吧。next_permutation是生成字典序的下一个的排列,比如abcd经过一次next_permutation后将变成abdc,函数返回值是bool 表示生成成功或者失败。如果已经是字典序最大的了,将返回false。此时将吧序列还原成字典序最小的序列。
如:
函数将会生成字典序在adbc之后全的排列,返回false后,序列变成abcd。
运行结果:
当然,要得到元素的所有序列,应该吧序列初始化成字典序最小的。(ps:简称sort ^-^ )。
prev_premutation函数刚好与next_premutation相反,生成的是字典序在原序列之前的序列。最终返回false后,序列将变成字典序最大的序列;
把上面程序的next改为prev后程序运行结果是:
poj_2718_Smallest Difference 和poj_3187_Backward Digit Sums 都是可以用全排列做的简单题,代码附上:
poj_2718 :
poj_3187 :
找到了 next_permutation and prev_permutation这两货,写一篇CSDN加深印象吧。(ps:有部分内容来自网络,大牛们别介意啊)
template<class BidirectionalIterator>
bool next_permutation(
BidirectionalIterator _First,
BidirectionalIterator _Last
);
template<class BidirectionalIterator, class BinaryPredicate>
bool next_permutation(
BidirectionalIterator _First,
BidirectionalIterator _Last,
BinaryPredicate _Comp
);
据说这是next_permutation的函数原型,菜鸟看不懂,先感受一下。
先掌握用法吧。next_permutation是生成字典序的下一个的排列,比如abcd经过一次next_permutation后将变成abdc,函数返回值是bool 表示生成成功或者失败。如果已经是字典序最大的了,将返回false。此时将吧序列还原成字典序最小的序列。
如:
int main(){ char a[]={'c','d','b','a'}; do{ for(int i=0;i<4;i++){ cout<<a[i]<<' '; } cout<<endl; } while (next_permutation(a,a+4)); cout<<"-------------------"<<endl; for(int i=0;i<4;i++){ cout<<a[i]<<' '; } cout<<endl; return 0; }
函数将会生成字典序在adbc之后全的排列,返回false后,序列变成abcd。
运行结果:
当然,要得到元素的所有序列,应该吧序列初始化成字典序最小的。(ps:简称sort ^-^ )。
prev_premutation函数刚好与next_premutation相反,生成的是字典序在原序列之前的序列。最终返回false后,序列将变成字典序最大的序列;
把上面程序的next改为prev后程序运行结果是:
poj_2718_Smallest Difference 和poj_3187_Backward Digit Sums 都是可以用全排列做的简单题,代码附上:
poj_2718 :
#include <queue> #include <math.h> #include <stdio.h> #include <iostream> #include <string.h> #include <algorithm> using namespace std; int main(){ int c; int n,minnum; char a[12]; char ch[50],ch0[50],ch1[50]; cin>>c;getchar(); while (c--){ n=0; minnum=10000000; memset(ch,0,sizeof(ch)); memset(ch0,0,sizeof(ch0)); memset(ch1,0,sizeof(ch1)); gets(ch); int len=strlen(ch); for (int i=0;i<len;i++){ if (ch[i]>='0'&&ch[i]<='9'){ a[n++]=ch[i]; } } if (n==2){ cout<<abs(a[0]-a[1])<<endl; continue; } do{ int aa=0,bb=0; if (a[0]=='0'||a[(n+1)/2]=='0') continue; for (int i=0;i<(n+1)/2;i++){ aa=aa*10+a[i]-'0'; } for (int i=(n+1)/2 ;i<n;i++){ bb=bb*10+a[i]-'0'; } minnum=min(minnum,abs(aa-bb)); }while (next_permutation(a,a+n)); cout<<minnum<<endl; } }
poj_3187 :
#include <queue> #include <math.h> #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; int main(){ int i,j; int n,s; int a[]={1,2,3,4,5,6,7,8,9,10}; int m[10]; scanf ("%d%d",&n,&s); do{ for (i=0;i<n;i++) m[i]=a[i]; for (i=1;i<n;i++){ for (j=0;j<n-i;j++){ m[j]=m[j]+m[j+1]; } } if (m[0]==s){ break; } }while (next_permutation(a,a+n)); for (i=0;i<n;i++) cout<<a[i]<<" "; cout<<endl; return 0; }
相关文章推荐
- 全排列函数——next_permutation() & prev_permutation()
- Algorithm头文件中的next_permutation全排列函数
- next_permutation的思想和用法(全排列函数)
- 全排列函数(next_permutation)
- C++ 全排列函数 std::next_permutation与std::prev_permutation
- C++ 全排列函数 std::next_permutation与std::prev_permutation
- 【原创】黑科技库(二): 全排列函数 next_permutation
- 全排列函数 next_permutation()
- C++ 全排列函数 std::next_permutation与std::prev_permutation
- 全排列函数 nyoj 366(next_permutation()函数)
- 蓝桥杯—next_permutation()全排列函数
- STL之next_permutation() 全排列函数
- 全排列函数 next_permutation
- 全排列函数 next_permutation && prev-permutation
- lintcode-medium-Next Permutation II
- next_permutation暴力搜索,POJ(3187)
- Bestcoder #82 Div2 ztr loves lucky numbers(next_permutation)
- HDU1716 排列2 next_permutation的用法
- nyoj 366 [【next_permutation()函数学习】
- next_permutation全排列