[题目描述]
在计算机科学领域,如何高效生成指定的序列是一个非常重要的问题。现在给你一个字符串,且这个字符串内部的字符已经升序有序。请你找出由这些字符构成的所有的序列。
[输入]
输入的第一行是一个整数n,表示测试数据组数。
接下来n行,每行输入一个字符升序有序的字符串。字符串中只包含小写字母,长度不超过8。
[输出]
对于每组输入,输出由输入的字符串中的字符构成的所有序列,按字典序升序排列,结果中不能出现相同的序列。
每组输出后面跟一个空行。
[样例输入]
3
ab
abc
bca
[样例输出]
ab
ba
[ ]
abc
acb
bac
bca
cab
cba
[ ]
abc
acb
bac
bca
cab
cba
[ ]
[思路分析]
这是排列组合的题目,完全可以用DFS把答案搜出来,较为简单。
[参考程序]
var a,b:array[1..5000]of char;
v:array[1..5000]of boolean;
i,j,k,l,m,n,t,num,tail:longint;
procedure qs;
var i,j:longint;
q:char;
begin
for i:=1 to n-1 do
begin
for j:=i+1 to n do
begin
if a[i]>a[j] then
begin
q:=a[i];
a[i]:=a[j];
a[j]:=q;
end;
end;
end;
end;
procedure print;
var i,j,k:longint;
begin
for i:=1 to n do
write(b[i]);
writeln;
end;
procedure dfs(k:longint);
var i,j,l:longint;
begin
if v[k] then
begin
v[k]:=false;
num:=num+1;
b[num]:=a[k];
if num=n then
print;
if num<>n then
for i:=1 to n do
dfs(i);
v[k]:=true;
num:=num-1;
end;
end;
begin
readln(t);
for l:=1 to t do
begin
n:=0;
if l<>1 then
readln;
while not eoln do
begin
inc(n);
read(a[n]);
end;
qs;
//dec(n);
num:=0;
tail:=0;
fillchar(v,sizeof(v),true);
for k:=1 to n do
dfs(k);
writeln;
end;
end.