next_permutation()——全排列
2012-12-13 20:48
295 查看
再也不用为全排列绞尽脑汁,递归什么的早就out了
next_permutation()这是个好东西
可以输出不重复的全排列
1.用comp()函数构造自己希望的排列方式
如POJ 1256:
我们可以这样输出
while(next_permutation(str,str+len,comp))//注意不能输出第一个排列
printf("%s\n",str);
这个comp(),sort()函数也可用,变为:AaBbCc序列
效果:str="aAb"
Aab Aba aAb
abA bAa baA
2.普通用法
NYOJ 19
题意:在1-n中选取m个字符进行全排列
3.适用于枚举情况,找出最优解
如:hdu 1572
while(cin>>T&&T)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(f,0,sizeof(f));
for(i=0;i<T;i++)
for(j=0;j<T;j++)
cin>>a[i][j];
cin>>N;
k=0;
for(i=0;i<N;i++)
{
cin>>n;
if(!f
)
{f
=1;b[k]=n;++k;}
}
sort(b,b+k);
XY=sum=0;
for(j=0;j<k;j++)
{
sum+=a[XY][b[j]];
XY=b[j];
}
max=sum;
while(next_permutation(b,b+k))//客人较少,最多7人,可枚举
{
XY=sum=0;
for(j=0;j<k;j++)
{
sum+=a[XY][b[j]];
XY=b[j];
}
if(sum<max)
max=sum;
}
cout<<max<<endl;
}
next_permutation()这是个好东西
可以输出不重复的全排列
1.用comp()函数构造自己希望的排列方式
如POJ 1256:
bool comp(const char &a,const char &b) { int x,y; if(islower(a)&&islower(b)) { if(a<b) return 1; else return 0; } else if(isupper(a)&&isupper(b)) { if(a<b) return 1; else return 0; } else if(isupper(a)&&islower(b)) { x=a-'A'; y=b-'a'; if(x<=y) return 1; else return 0; } else { x=a-'a'; y=b-'A'; if(x<y) return 1; else return 0; } }
我们可以这样输出
while(next_permutation(str,str+len,comp))//注意不能输出第一个排列
printf("%s\n",str);
这个comp(),sort()函数也可用,变为:AaBbCc序列
效果:str="aAb"
Aab Aba aAb
abA bAa baA
2.普通用法
NYOJ 19
题意:在1-n中选取m个字符进行全排列
#include <iostream> #include <algorithm> #include <cstring> using namespace std; int main() { char str[15],copy[15],cut[15]; int i,n,x,y; cin>>n; while(n--) { cin>>x>>y; memset(str,0,sizeof(str)); memset(copy,0,sizeof(copy)); memset(cut,0,sizeof(cut)); for(i=0;i<x;i++) str[i]=i+1+'0'; strncpy(copy,str,y);//输出第一个排列 cout<<copy<<endl; while(next_permutation(str,str+x)) { strncpy(cut,str,y); if(strcmp(copy,cut)!=0) { cout<<cut; cout<<endl; } strncpy(copy,str,y); } } return 0; }
3.适用于枚举情况,找出最优解
如:hdu 1572
while(cin>>T&&T)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(f,0,sizeof(f));
for(i=0;i<T;i++)
for(j=0;j<T;j++)
cin>>a[i][j];
cin>>N;
k=0;
for(i=0;i<N;i++)
{
cin>>n;
if(!f
)
{f
=1;b[k]=n;++k;}
}
sort(b,b+k);
XY=sum=0;
for(j=0;j<k;j++)
{
sum+=a[XY][b[j]];
XY=b[j];
}
max=sum;
while(next_permutation(b,b+k))//客人较少,最多7人,可枚举
{
XY=sum=0;
for(j=0;j<k;j++)
{
sum+=a[XY][b[j]];
XY=b[j];
}
if(sum<max)
max=sum;
}
cout<<max<<endl;
}
相关文章推荐
- HDU.1027 Ignatius and the Princess II【全排列:关于next_permutation问题】(3.14)
- 全排列生成算法:next_permutation
- 方格填数-用next_permutation()全排列函数做的
- 递归回溯 求N个数的全排列 及 next_permutation的使用
- 全排列 next_permutation 简单用法
- STL 中 next_permutation 的全排列思路
- 1256 Anagram 全排列 next_permutation 用法
- 计算下一个全排列(以STL中的next_permutation为例)
- 【C++_STL_next_permutation】全排列讲解
- 打印全排列和stl::next_permutation
- 全排列(next_permutation,递归)
- next_permutation()函数 (数字1~10内实现全排列)
- 全排列 next_permutation
- 全排列生成算法:next_permutation
- next-permutation与prev-permutation及递归实现全排列
- 全排列生成算法:next_permutation
- [STL]next_permutation全排列
- Backward Digit Sums POJ - 3187(next_permutation全排列)
- 2018年全国多校算法寒假训练营练习比赛(第四场) H 老子的全排列呢(next_permutation)
- 全排列(next_permutation)