回 帖 发 新 帖 刷新版面

主题:加分帖~

8皇后问题:
在8*8的国际象棋盘上,摆8个皇后,要使它们互相吃不到~[em18][em18]
各位大虾帮个忙,我是新手~~

回复列表 (共9个回复)

沙发

program tt;
var a:array [1..8] of integer;
    b,c,d:array [-7..16] of integer;
    t,i,j,k:integer;
procedure print;
begin
      t:=t+1;
      write(t,'       ');
      for k:=1 to 8 do write(a[k],'   ');
      writeln;
end;

procedure try(i:integer);
var j:integer;
begin
     for j:=1 to 8 do
          if (b[j]=0) and (c[i+j]=0) and (d[i-j]=0) then
          begin
                a[i]:=j;
                b[j]:=1;
                c[i+j]:=1;
                d[i-j]:=1;
                if i<8 then try(i+1)
                        else print;
               b[j]:=0;
               c[i+j]:=0;
               d[i-j]:=0;
          end;
end;
begin
     for k:=-7 to 16 do
     begin
          b[k]:=0;
          c[k]:=0;
          d[k]:=0;
     end;
     try(1);
end.

板凳

这个我回过两次了.你可以用搜索功能找的.

3 楼

谢谢了

4 楼

program eightqueens;
 var
  x:array[1..8] of integer;
  a,b,c:array[-7..16] of boolean;
  i:integer;
 procedure print;
  var k:integer;
  begin
   for k:=1 to 8 do write(x[k]:4);
   writeln;
  end;
 procedure try(i:integer);
  var j:integer;
  begin
   for j:=1 to 8 do
    if a[j] and b[i+j] and c[i-j]
     then begin
   x[i]:=j;
   a[j]:=false;
   b[i+j]:=false;
   c[i-j]:=false;
   if i<8 then try(i+1)
    else print;
   a[j]:=true;
   b[i+j]:=true;
   c[i-j]:=true
  end
 end;
 begin
  for i:=-7 to 16 do
   begin
    a[i]:=true;
    b[i]:=true;
    c[i]:=true
   end;
  try(1);
 end.
这个更简单。

5 楼

可以用搜索。

6 楼

搜索呀!!~~`

7 楼

我用搜索搜过. 你也试下

8 楼

用穷举搜索即可.不过效率较低.也可以用回溯搜索,只不过编起来较慢.自己选择用哪一种.

[fly]加点分![/fly]

9 楼

八皇后问题很经典,有不少现成的代码可用,你可以借鉴呀,当然自己能琢磨出来那就更好了。

我来回复

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