主题:一个回溯的初级题目,悬赏求救,送分题!
cxxx401
[专家分:140] 发布于 2007-07-10 09:43:00
题目很简单啦,只不过这个程序有点问题。
问题描述:输入n,然后输出n的全排列。
样例输入:3
样例输出:123 132 213 231 312 321
我的程序:
program ex1_1;
var n,k,j,i:integer;
a:array[1..100]of integer;
procedure find(k:integer);
var b:boolean;
begin
if k>n then begin
for j:=1 to n do
write(a[j]);
writeln;
end
else
for i:=1 to n do
begin
b:=true;
for j:=1 to k-1 do
if a[j]=i then b:=false;
if b then begin
a[k]:=i;
find(k+1);
end;
end;
end;
begin
read(n);
find(1);
end.
运行后只输出一组数据,我看得,递归回来以后因为i的值没变,所以就无法继续,咳,我也说不清楚,自己看吧。
大家帮帮忙!
回复列表 (共10个回复)
沙发
Matodied [专家分:7560] 发布于 2007-07-10 11:16:00
我的程序:
(干吗用回朔,递归不就行了?)
PROCEDURE p(i: INTEGER);
VAR
j, k: INTEGER; f: BOOLEAN;
BEGIN
FOR j:=1 TO s DO BEGIN
a[i] := j; f := TRUE;
FOR k:=1 TO i - 1 DO BEGIN
IF a[k] = a[i] THEN f := FALSE;
END;
IF f THEN BEGIN
IF i < s THEN BEGIN
p(i + 1);
END ELSE BEGIN
pri;
END;
END;
a[i] := 0;
END;
END;
PROCEDURE pri;
BEGIN
FOR i:=1 TO s DO WRITE(a[i]);
WRITELN;
END;
TYPE arr = ARRAY[1..100] OF INTEGER;
VAR
a: arr; s: INTEGER;
BEGIN
READLN(s);
p(1);
END.
板凳
007bond [专家分:540] 发布于 2007-07-16 08:01:00
Matodied, 你的程序错误一箩筐,这么简单的一道题,何必用回朔和递归,看偶的吧
var n,j,i,k:integer;b:array[0..1000] of integer;
ch: set of 1..100;
begin
readln(n);
FOR i:=1 TO n do b[i]:= 1;
WHILE b[0] = 0 do
begin
j:=n;ch:=[];k:=0;
for i:=1 to n do ch:=ch+[b[i]];
for i:=1 to n do
begin
if i in ch then k:=k+1;
end;
if k=n then
begin
for i:=1 to n do write(b[i],' ');
writeln
end;
WHILE (b[j] = n) AND (j > 0) do j:=j-1;
b[j]:=b[j]+1;
FOR i:=j+1 TO n do b[i]:=1;
end;
END.
3 楼
007bond [专家分:540] 发布于 2007-07-16 08:03:00
还有,偶想告诫大家,不要不会走就学飞(当然,没人会飞).
4 楼
abcwuhang [专家分:1840] 发布于 2007-07-16 17:09:00
?
5 楼
abcwuhang [专家分:1840] 发布于 2007-07-16 17:10:00
http://www.programfan.com/club/post-242503.html
6 楼
w1212q [专家分:660] 发布于 2007-07-16 23:22:00
这些算法....在QBASIC 论坛可以找到一箱,,AND 效率都还很好
7 楼
007bond [专家分:540] 发布于 2007-07-17 09:25:00
郁闷哪,Matodied的程序错误一箩筐,都有分,而偶的简单易懂,不占用过多内存,还完全正确,却没分,Matodied得分超狂,而偶却只有240分,谁来可怜偶007bond啊
8 楼
cxxx401 [专家分:140] 发布于 2007-07-17 18:14:00
各位啊,我不想要别的算法,我就是想练一练回溯,然后做了这个小题,结果不成功,郁闷哪,不知道错误出在哪。不要程序,就要指出错误就行了。
好像在tp里是可以的,可是到fp就不大对了,不知道为什么。
Matodied那个程序虽然不大对,但是辛苦费是要给的。
9 楼
abcwuhang [专家分:1840] 发布于 2007-07-18 12:06:00
哦
10 楼
qqym710 [专家分:140] 发布于 2007-07-18 21:44:00
program ex;
var a:array[0..32767]of integer;
n:integer;
procedure init;
var i:integer;
begin
readln(n);
for i:=1 to n do a[i]:=i;
end;
procedure main(k,s:byte);
var i:integer;
begin
if k>n then
begin
for i:=1 to n do write(a[i],' ');
writeln;
exit;
end
else
begin
for i:=s to n do
begin
a[0]:=a[s];
a[s]:=a[i];
a[i]:=a[0];
main(k+1,s+1);
a[0]:=a[s];
a[s]:=a[i];
a[i]:=a[0];
end;
end;
end;
begin
init;
main(1,1);
end.
小样,我偏用回朔,咋样???
你的集合不超过255,吓唬人是不??
我来回复