回 帖 发 新 帖 刷新版面

主题:一个回溯的初级题目,悬赏求救,送分题!

题目很简单啦,只不过这个程序有点问题。
问题描述:输入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个回复)

沙发

我的程序:
(干吗用回朔,递归不就行了?)
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.

板凳

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 楼

还有,偶想告诫大家,不要不会走就学飞(当然,没人会飞).

4 楼

?

5 楼

http://www.programfan.com/club/post-242503.html

6 楼

这些算法....在QBASIC 论坛可以找到一箱,,AND 效率都还很好

7 楼

郁闷哪,Matodied的程序错误一箩筐,都有分,而偶的简单易懂,不占用过多内存,还完全正确,却没分,Matodied得分超狂,而偶却只有240分,谁来可怜偶007bond啊

8 楼

各位啊,我不想要别的算法,我就是想练一练回溯,然后做了这个小题,结果不成功,郁闷哪,不知道错误出在哪。不要程序,就要指出错误就行了。
好像在tp里是可以的,可是到fp就不大对了,不知道为什么。
Matodied那个程序虽然不大对,但是辛苦费是要给的。

9 楼

10 楼

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,吓唬人是不??

我来回复

您尚未登录,请登录后再回复。点此登录或注册