合肥
合肥奥数网

合肥站
奥数网

信息学竞赛常用算法与策略:回溯(4)

合肥奥数网整理 2013-01-17 14:56:03

  例2:n皇后问题的递归算法如下:

  程序1:

  program hh;

  const n=8;

  var i,j,k:integer;

  x:array[1..n] of integer;

  function place(k:integer):boolean;

  var i:integer;

  begin

  place:=true;

  for i:=1 to k-1 do

  if (x[i]=x[k]) or (abs(x[i]-x[k])=abs(i-k)) then

  place:=false  ;

  end;

  procedure print;

  var i:integer;

  begin

  for i:=1 to n do write(x[i]:4);

  writeln;

  end;

  procedure try(k:integer);

  var i:integer;

  begin

  if k=n+1 then begin print; exit end;

  for i:= 1 to n do

  begin

  x[k]:=i;

  if place(k) then try(k+1);

  end;

  end ;

  begin

  try(1);

  end.

  程序2:

  说明:当n=8 时有30条对角线分别用了l和r数组控制,

  用c数组控制列.当(i,j)点放好皇后后相应的对角线和列都为false.递归程序如下:

  program nhh;

  const n=8;

  var s,i:integer;

  a:array[1..n] of byte;

  c:array[1..n] of boolean;

  l:array[1-n..n-1] of boolean;

  r:array[2..2*n] of boolean;

  procedure output;

  var i:integer;

  begin

  for i:=1 to n do write(a[i]:4);

  inc(s);writeln('  total=',s);

  end;

  procedure try(i:integer);

  var j:integer;

  begin

  for j:=1 to n do

  begin

  if c[j] and l[i-j] and r[i+j] then

  begin

  a[i]:=j;c[j]:=false;l[i-j]:=false; r[i+j]:=false;

  if i<n then try(i+1) else output;

  c[j]:=true;l[i-j]:=true;r[i+j]:=true;

  end;

  end;

  end;

  begin

  for i:=1 to n do c[i]:=true;

  for i:=1-n to n-1 do l[i]:=true;

  for i:=2 to 2*n do r[i]:=true;

  s:=0;try(1);

  writeln;

  end.

首页 上一页 下一页 尾页

相关推荐

点击查看更多
重点初中
首页 导航