回溯没有显示任何东西

时间:2016-03-17 17:48:32

标签: pascal backtracking

我想找到移动这些数字1,2,3,4,5的所有可能性,条件是“4,3”是不可能的,1和5不能在同一个解决方案中。我有这个代码但是当我编译它时它没有向我显示任何内容。

var  x:array[1..50] of integer;
i,k:integer;
avems,evalid:boolean;

procedure init;
begin
  x[k]:=0;
end;

procedure succesor;
begin
  if x[k]<5 then avems:=true
    else avems:=false;
  if avems=true then x[k]:=x[k]+1;
end;

function solutie:boolean;
begin
  if k=3 then solutie:=true
    else solutie:=false;
end;

procedure valid;
begin
  evalid:=true;

  for i:=1 to k-1 do
    if (x[i]=1) or (x[i]=5) and (x[k]=1) or (x[k]=5) then evalid:=false;

  if (k>1) and (x[k-1]=4) and (x[k]=3) then evalid:=false;
end;

procedure tipar;
begin
  for i:=1 to 3 do
    write(x[i],' ');

  writeln;
end;

begin
  k:=1;
  init;
  while k>0 do
  begin
    repeat
      succesor;
    until not(avems) or (avems and evalid);

    if avems then
      if solutie then tipar
        else begin
          k:=k+1;
          init;
        end
        else k:=k-1;
  end;
end.

1 个答案:

答案 0 :(得分:1)

你期待什么?您的代码会递增x[1]直到达到5,然后设置avems:=false;然后将k递减到零并退出循环。

请记住,Pascal 对像Python这样的块使用缩进,所以你的

更清楚地写出了最后的步骤
if avems then begin
  if solutie then tipar
  else begin
    k:=k+1;
    init;
  end
end
else k:=k-1;

如果这不是你想要的,你必须编写一些begin/end