回 帖 发 新 帖 刷新版面

主题:8queen八皇后问题(回溯算法)

这个程序到底有什么问题啊?我整天调试错误,能不能帮我解决一下?

program eightqueen;
var
   a:array[1..8] of integer;
   i,j,m:integer;
   queen:boolean;

procedure print;
   var t:integer;
begin
for t:=1 to 8 do write('(',t,',',a[t],') ');
writeln;
end;

procedure chk(x:integer);
begin
queen:=true;
for j:=1 to x-1 do if (a[j]=a[x]) or (abs(a[x]-a[j])=abs(x-j)) then queen:=false;
end;

procedure proc(x:integer);
begin
for i:=x+1 to 8 do a[i]:=1;
chk(x);
while (x<=8) and (a[x]<8) and (queen=false) do
      begin
      a[x]:=a[x]+1;
      chk(x);
      if (queen=false) or (a[x]>8) then
         begin
         while a[x]=8 do
               begin
               x:=x-1;
               end;
         a[x]:=a[x]+1;
         chk(x);
         end;
      end;
      if x<8 then proc(x+1) else
         begin
         print;
         queen:=false;
         proc(7);
         end;
end;

begin
a[1]:=1;
proc(1);
end.

回复列表 (共6个回复)

沙发

if (queen=false) or (a[x]>8) then
         begin
         while a[x]=8 do
               begin
               x:=x-1;
               end;
         a[x]:=a[x]+1;
         chk(x);
         end;
这里有点奇怪
a[x]〉8怎么办呢?

板凳

为什么每次上都看见有人在问这种问题?
似乎任何一本高级本都有答案对照

3 楼

似乎总体上都是对的
可能问题出现在一些细节上

4 楼

细节问题最好是自己单步调试一步一步耐心地调,这样可以锻炼自己的调试能力

5 楼


我这次重写了一下,结果应该正确,但还没输出完,输出到(1,6)时就提示"Stack Overflow Error"这是什么回事?


program eightqueen;
var
   a:array[1..8] of integer;
   i:integer;

procedure print;
   var t:integer;
begin
for t:=1 to 8 do write('(',t,',',a[t],') ');
writeln;
end;

procedure cls(z:integer);
var i:integer;
begin
for i:=z+1 to 8 do a[i]:=0;
end;

function chk(y:integer):boolean;
var j:integer;
begin
chk:=true;
if (a[y]>8) or (a[y]<1) then chk:=false;
for j:=1 to y-1 do if (a[j]=a[y]) or (abs(a[j]-a[y])=abs(j-y)) then chk:=false;
end;

procedure proc(x:integer);
begin
cls(x);
while ((not chk(x)) and (a[x]<=8)) do
      begin
      a[x]:=a[x]+1;
      end;
if a[x]>8 then
   begin
   x:=x-1;
   a[x]:=a[x]+1;
   proc(x);
   end;
if chk(x) then
   begin
   if x=8 then
      begin
      print;
      a[7]:=a[7]+1;
      proc(7);
      end
   else proc(x+1);
   end;
end;

begin
proc(1);
end.

还有,结果都找到了的时候,应怎样退出?

6 楼

最后是递归自然结束退出的

我来回复

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