通俗易懂
嗯根据字典序排列的·········
1. next_permutation(start,end)//当前排列的下一个排列
2. prev_permutation(start,end)//当前排列的上一个排列
3. int num[10];
4. next_permutation(num,num+10)
5. //对num数组中的十个数进行全排列可以演示一下看看他的全排规律//对num数组中的十个数进行全排列可以演示一下看看他的全排规律
6. //可以改变数字对数组中的几个数进行全排列而其他的不改变//可以改变数字对数组中的几个数进行全排列而其他的不改变
5.例: next_permutation(num+1,num+5);
7. 注意排列的同时数组中的各个值也在变化,跟排列的一起变化
8. 注意他会在这个数组所在的当前排序根据这个函数全排列要求进行后面排列所以根据题目要求有时会先sort一下;
9. 结构体自定义排序
next_permutation(num,num+,n,cmp)emmm其实还不太会·····
10.应用
题目1: http://acm.hdu.edu.cn/showproblem.php?pid=1716
代码如下
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int main()
{
int a[5],b[10],p,flag=0;
while(~scanf("%d %d %d %d",&a[0],&a[1],&a[2],&a[3]))
{
if(a[0]==0&&a[1]==0&&a[2]==0&&a[3]==0)
break;
if(flag)
printf("\n");
p=a[0];
sort(a,a+4);
int step=0;
do
{
if(a[0]==0)
continue;
if(a[0]==p&&step)
{
printf(" ");
}
else if(a[0]!=p&&step)
{
printf("\n");
}
for(int i=0; i<4; i++)
printf("%d",a[i]);
p=a[0];//之前的那位
step++;
}while(next_permutation(a,a+4));
printf("\n");
flag++;
}
return 0;
}
题目2:
http://www.acmicpc.sdnu.edu.cn/problem/show/1169
代码如下
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn=10005;
int main()
{
int n,m,a[maxn],k=0;
scanf("%d",&n);
scanf("%d",&m);
for(int i=0; i<n; i++)
scanf("%d",&a[i]);
while(next_permutation(a,a+n))
{
k++;
if(k==m)
{
for(int i=0; i<n-1; i++)
printf("%d ",a[i]);
printf("%d",a[n-1]);
break;
}
}
return 0;
}
嗯,自定义结构体那方面要学习一下,题目如下
http://poj.org/problem?id=1256
这是个自定义的
emmm明天做吧········溜········