主题:tjoj1002
euclid
[专家分:1670] 发布于 2005-05-23 03:28:00
Problem
将一个字符组全排序
Input
一个长度小于10的字符串,该字符串由数字1~9组成。字符不会重复出现。
Output
按数字在输入串中出现的次序从小到大的顺序输出该字符组的全排序
Sample Input
132
Sample Output
1 3 2
1 2 3
3 1 2
3 2 1
2 1 3
2 3 1
怎么想都想不出来
回复列表 (共9个回复)
沙发
faintzw [专家分:2660] 发布于 2005-05-23 12:21:00
可以用组合数学里讲的排列生成法,也可以直接搜索
板凳
davidw017 [专家分:4170] 发布于 2005-05-23 19:00:00
我曾看过一个楼上提到的排列生成法的程序,逻辑上比较乱。所以使用深搜即可。
3 楼
euclid [专家分:1670] 发布于 2005-05-23 19:56:00
我还没学数结,能告诉我怎么排列吗
4 楼
faintzw [专家分:2660] 发布于 2005-05-23 20:44:00
汗……对于这道题是搜索就可以的了,但是规模一大,搜索就……呵呵……
我试验过,我写的生成排列比搜索生成快10倍以上。
楼上的,用递归写深搜,不需要什么复杂的数据结构(用递归就不必自己弄栈)
5 楼
davidw017 [专家分:4170] 发布于 2005-05-26 19:01:00
// 给出一个求全排序的方法,貌似比 dfs 好不少
program _;
const maxn = 100;
var
i,j,m,t:integer;
p:array[1..maxn] of integer;
count:integer;
begin
readln(m);
for i:= 1 to m do p[i] := i; write(i); end;
writeln;
repeat
i := m;
while (i>1) and (p[i-1]>=p[i]) do dec(i);
if i = 1 then break;
j := m;
while (j>0) and (p[i-1]>p[j]) do dec(j);
if j = 0 then break;
t := p[i-1]; p[i-1] := p[j]; p[j] := t;
for j := 1 to (m-i+1) div 2 do begin
t := p[i+j-1]; p[i+j-1] := p[i+j-1] := p[m-j+1]; p[m-j+1] := t;
end;
for i := 1 to m do write(p[i]);
writeln;
until false;
end.
6 楼
eastcowboy [专家分:25370] 发布于 2005-05-26 20:53:00
郁闷ing
做是做了,就是Wrong Answer,我自己怎么看都是对的呀!
7 楼
davidw017 [专家分:4170] 发布于 2005-05-27 17:53:00
我这个没有考虑 ACM,他的多组数据和输出格式我这里都没有顾及。
8 楼
eastcowboy [专家分:25370] 发布于 2005-06-02 00:01:00
我也用DFS呀,Wrong Answer...
9 楼
faintzw [专家分:2660] 发布于 2005-06-02 23:53:00
var
s :array[1..9]of integer;
u :array[1..9]of boolean;
str :string;
n :integer;
procedure print;
var
i :integer;
begin
for i:=1 to n-1 do
write(str[s[i]],' ');
writeln(str[s[n]]);
end;
procedure dfs(d:integer);
var
i :integer;
begin
for i:=1 to n do
if not u[i] then
begin
u[i]:=true;
s[d]:=i;
if d=n then print else dfs(d+1);
u[i]:=false;
end;
end;
{=======main=======}
begin
readln(str);
n:=length(str);
dfs(1);
end.
WA?汗……
这个是AC的DFS程序,很简单的……
我来回复