Description
给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。 我们假设对于小写字母有’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
算法
本题就是一个简单的生成全排列的题目,可以有很多算法,我用的是递归去做,或者看作是全排列组成的树上的深搜也没有问题。注意读入之前先排一下序,因为数据量少就随手用了选择排序
AC Code
#include<stdio.h>
#include<string.h>
#define MAXSCALE 6
void Find(char * perm, char * elem, int * Mark, int N, int Len);
// perm存放排列,elem存放元素,Mark标志是否已经被选入排列,N表示待选择的元素个数,Len是总元素数
void Sort(char * Elem, int N);
int main()
{
char Elem[MAXSCALE + 5], perm[MAXSCALE + 5];
int Len, Mark[MAXSCALE + 5] = {};
scanf("%s", Elem);
Len = strlen(Elem);
Sort(Elem, Len);
Find(perm, Elem, Mark, Len, Len);
return 0;
}
void Find(char * perm, char * elem, int * Mark, int N, int Len)
{
if (N == 0) {
for (int i = 0; i < Len; i++) {
putchar(perm[i]);
}
printf("\n");
}
for (int i = 0; i < Len; i++) {
if (Mark[i] == 0) {
perm[Len - N] = elem[i];
Mark[i] = 1;
Find(perm, elem, Mark, N - 1, Len);
Mark[i] = 0;
}
}
}
void Sort(char * Elem, int N)
{
for (int i = 0; i < N - 1; i++) {
for (int j = i + 1; j < N; j++) {
if (Elem[i] > Elem[j]) {
char tmp = Elem[i];
Elem[i] = Elem[j];
Elem[j] = tmp;
}
}
}
}