PASCAL八皇后问题

来源:百度知道 编辑:UC知道 时间:2024/05/04 16:43:49
输出一共有几种方法,我写的程序不知为何不对,请各位赐教:

var
s,i,j,l,n:integer;
a:array[1..8,1..8]of integer;

procedure find(k:integer);
var
p:integer;
begin
if k>8 then s:=s+1 else
begin
for i:=1 to 8 do
begin
p:=0;
a[i,k]:=1;
for j:=1 to k-1 do
if a[i,j]<>0 then p:=1;
if p=0 then
for l:=1 to 8 do
for n:=1 to k do
if (a[l,n]=1) and (abs(l-n)=abs(i-k)) then p:=1;
if p=0 then begin a[i,k]:=1; find(k+1); end
else a[i,k]:=0;
end;
end;
end;

begin
for i:=1 to 8 do
for j:=1 to 8 do
a[i,j]:=0;
find(1);
writeln(s);
end.

var
n,upperlim,sum:longint;
procedure test(row,ld,rd:longint);
var
pos,p:longint;
begin

if row<>upperlim then
begin
pos:=upperlim and not (row or ld or rd);
while pos<>0 do
begin
p:=pos and -pos;
pos:=pos-p;
test(row+p,(ld+p)shl 1,(rd+p)shr 1);
end;
end
else inc(sum);

end;
begin
readln(n);
sum:=0;
upperlim:=(1 shl n)-1;
test(0,0,0);
writeln(sum);
end.
位运算才是王道啊,用这个交usaco秒过

这个正确,是n皇后问题,改改n就可以了
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]