next_permutation函数与perv_permutation函数声明:#include <algorithm>
注意:两个函数初始分别为1,2,3 3,2,1否有不同的输出
next_permutation()函数功能是输出所有比当前排列大的排列,顺序是从小到大。
如(1 2 3排列)1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
int a[100];
a[0]=1;a[1]=2;a[2]=3;
do{
cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;//注意如果开始是这样a[1],a[0],a[2],顺序又不同了
}while(next_permutation(a,a+3));//参数3代表排列长度,注意如果改为2就不同了
return 0;
}
prev_permutation()函数功能是输出所有比当前排列小的排列,顺序是从大到小。(与上相反)
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
int a[100];
a[0]=3;a[1]=2;a[2]=1;
do{
cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;//注意如果开始是这样a[1],a[0],a[2],顺序又不同了
}while(prev_permutation(a,a+3));//参数3代表排列长度,注意如果改为2就不同了
return 0;
}
/*
3 2 1
3 1 2
2 3 1
2 1 3
1 3 2
1 2 3
Process returned 0 (0x0) execution time : 0.109 s
Press any key to continue.*/
如下例题:
FJ and his cows enjoy playing a mental game. They write down the numbers from 1 to N (1 ≤ N ≤ 10) in a certain order and then sum adjacent numbers to produce a new list with one fewer number. They repeat this until only a single number is left. For example, one instance of the game (when N=4) might go like this:
3 1 2 4
4 3 6
7 9
16
Behind FJ's back, the cows have started playing a more difficult game, in which they try to determine the starting sequence from only the final total and the number N. Unfortunately, the game is a bit above FJ's mental arithmetic capabilities.
Write a program to help FJ play the game and keep up with the cows.
Multiple test cases. For each case:
* Line 1: Two space-separated integers: N and the final sum.
For each case, output one line : An ordering of the integers 1..N that leads to the given sum. If there are multiple solutions, choose the one that is lexicographically least, i.e., that puts smaller numbers first.
4 16
3 1 2 4
Explanation of the sample:
There are other possible sequences, such as 3 2 1 4, but 3 1 2 4 is the lexicographically smallest.
#include <stdio.h>
#include <algorithm>
using namespace std;
int main()
{
int n,sum,i,j;
while(~scanf("%d%d",&n,&sum))
{
int a[12][12]={0};
int b[10]={1,2,3,4,5,6,7,8,9,10};
do{
for(i=0;i<n;i++)
a[0][i]=b[i];
for(i=1;i<n;i++)
for(j=0;j<n-i;j++)
a[i][j]=a[i-1][j]+a[i-1][j+1];
if(a[n-1][0]==sum)
break;
}while(next_permutation(b,b+n));
for(i=0;i<n;i++)
{
if(i!=0)
printf(" ");
//cout<<" ";
printf("%d",b[i]);
//cout<<b[i];
}
printf("\n");
}
return 0;
}