在N*N的棋盘上放上N个皇后,使任意两个皇后都不会互相攻击。 有时一个问题的情况比较复杂、答案又很多,我们却苦于连一种解都找不到。用回溯法未必能等得来。用拉斯维加斯算法不失为一个好办法。 (* Question Eight Queens. Arithmetic Las Vegas. Programmed by j.t.Chang. *) program LV_queens; const N=50; var x:array[1..N] of integer; i:integer; procedure PrintResult; var i: integer; begin for i:=1 to N do write(x[i]:4); Readln; end; function place(k: integer): boolean; var j:integer; begin for j:=1 to k-1 do if (abs(k-j)=abs(x[k]-x[j])) or (x[k]=x[j]) then begin place:=false; exit; end; place:=true; end; function queensLV: boolean; var k,i,j,count: integer; begin k:=1; count:=1; randomize; while (k<=N) and (count>0) do begin count:=0; for i:=1 to N do begin x[k]:=i; if place(k) then begin count:=count+1; if random(count)=0 then j:=i; end; end; if count>0 then begin x[k]:=j; k:=k+1; end; end; queensLV:= count>0 ; end; begin writeln('Finding one answer of question ',N,' queens.'); writeln('Please wait...'); for i:=1 to N do x[i]:=0; while not queensLV do; PrintResult; end.

评论