全排列函数的用法

题目1:

给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。 我们假设对于小写字母有'a' < 'b' < ... < 'y' < 'z',而且给定的字符串中的字母已经按照从小到大的顺序排列。

Input

输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。

Output

输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。字母序如下定义:

已知S = s1s2...sk , T = t1t2...tk,则S < T 等价于,存在p (1 <= p <= k),使得
s1 = t1, s2 = t2, ..., sp - 1 = tp - 1, sp < tp成立。

Sample Input

abc

Sample Output

abc
acb
bac
bca
cab
cba

思路:

因为要让字母序比较小的在前面并且输入是个字符并不一定是按顺序输入的,所以我们可以通过sort函数对子符串进行排序

全排列的函数为:1、next_permutation(start,end)从小到大;

                             2、prev_permutation(start,end)从大到小。

代码:

#include
#include
#include
using namespace std;
int main()
{
	char a[10];
	int n; 
	scanf("%s",a);
	n=strlen(a);
	sort(a,a+n);
	do
	{
		printf("%s\n",a);
	}
	while(next_permutation(a,a+n));//使用while的话会导致全排列输出的情况缺少一种
	return 0;
}

题目2:

输出自然数 1到 n所有不重复的排列,即 n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。

输入格式

一个整数 n(1≤n≤9)。

输出格式

由 1∼n 组成的所有不重复的数字序列,每行一个序列。每个数字保留 5个常宽。

Sample Input

3

Sample Output

    1    2    3
    1    3    2
    2    1    3
    2    3    1
    3    1    2
    3    2    1

思路:

该题与题目1用法基本一致,但该题不需要使用sort函数。当输入一个整数n的时候,我们需要把小于等于n的所有正整数以数列的方式存储起来,再将该数列进行全排列。

代码:

#include
#include
#include
using namespace std;
int main()
{
	int a[10];
	int n,i; 
	scanf("%d",&n);
	for(i=0;i

你可能感兴趣的:(c语言,c++)