主题:[讨论]这个程序要怎么写?
zlneed
[专家分:0] 发布于 2010-05-02 20:29:00
给出一个数n,求出该数的全排列。
譬如:3
有 1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
回复列表 (共2个回复)
沙发
小田甜 [专家分:3910] 发布于 2010-05-03 00:19:00
如果要解的个数,那么这道题目就是个计算n!的题目,用高精度就好了。
如果是让输出每一种情况,那么这道题目显然复杂度是n!的。
可以简单的按照字典序找到下一个,ABCDE->ABCED->ABDCE(从后向前找到第一个不是递增的,将最后一个字母移动到前面就得到字典序中的下一个。)知道搜索到EDCBA为止。
程序就不写了,网上一搜一大把。
板凳
chip [专家分:80] 发布于 2010-08-06 12:31:00
//真不好意思,只能过小数据,行吗?
program pailie;
var
a:array[1..20]of boolean;
b:array[0..20]of integer;
i,n:integer;
procedure print;
var i:integer;
begin
for i:=1 to n do write(b[i],' ');
writeln;
end;
procedure find(p:integer);
var i:integer;
begin
if p=n then print
else begin
for i:=1 to n do if a[i] then begin
a[i]:=false;
b[p+1]:=i;
find(p+1);
a[i]:=true;
end;
end;
end;
begin
readln(n);
for i:=1 to n do a[i]:=true;
for i:=1 to n do begin
b[1]:=i;
a[i]:=false;
find(1);
a[i]:=true;
end;
readln;
end.
我来回复