北大慕课程序设计与算法(二)第二周测验 全排列
总时间限制:
1000ms
内存限制:
65536kB
描述
给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。 我们假设对于小写字母有’a’ < ‘b’ < … < ‘y’ < ‘z’,而且给定的字符串中的字母已经按照从小到大的顺序排列。
输入
输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。
输出
输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。字母序如下定义:
已知S = s1s2…sk , T = t1t2…tk,则S < T 等价于,存在p (1 <= p <= k),使得
s1 = t1, s2 = t2, …, sp - 1 = tp - 1, sp < tp成立。
样例输入
abc
样例输出
abc
acb
bac
bca
cab
cba
思路
创建一个dfs数组用来记录每个元素是否已经用过,然后一直递归即可。
这里主要用了一个回溯,用来清除用过的“痕迹”。
代码
#include <iostream>
#include <algorithm>
#include <string.h>
#define PI 3.14159265358979383246
#define LL long long
#define _for(i, a) for(int i = 0; i < (a); ++i)
#define _rep(i, a, b) for(int i = (a); i < (b); ++i)
using namespace std;
int used[7] = { 0 };
char result[7];
void f(char a[], int k, int n) {
if (k == n) {
result[k] = 0;
cout << result << endl;
return;
}
_for(i, n) {
if (used[i] == 0) {
result[k] = a[i];
used[i] = 1;
f(a, k + 1, n);
used[i] = 0;//回溯
}
}
}
int main()
{
char a[7];
int n;
cin >> a;
n = strlen(a);
sort(a, a + n);
f(a, 0, n);
return 0;
}
欢迎有问题的小伙伴一起交流哦~