Các anh ơi, em mới làm quen với thuật toán quay lui, và đang xử lý bài toán xếp Hậu, em đã đọc kỹ thuật toán và code lại vào FPC nhưng chỉ tìm được 6 nghiệm, (bài toán với bàn cờ 8x8), trong khi kết quả của bài toán là 92 nghiệm, đây là code của nó, các anh giúp em tìm lỗi sai với ạ, em xin cảm ơn.
Code: |
(*=================================================
N Hau
=================================================*)
{$B-}
uses crt;
const
MN = 20;
gn = 'N_HAU.OUT';
BL = #32; {dau cach}
var
v: array[0..MN] of byte;
n: byte; {so quan hau, kich thuoc ban co}
g: text; {tep ket qua}
(*-------------------------------------------------
Kiem tra xem co dat duoc Hau i
tai o (v[i],i) cua ban co khong?
-------------------------------------------------*)
function DatDuoc(i: byte): Boolean;
var j: byte;
begin
DatDuoc := false;
for j := 1 to i-1 do
if (v[i] = v[j]) or (i-j = abs(v[i]-v[j]))
{Hau j an duoc Hau i}
then exit;
DatDuoc := true;
end;
(*-------------------------------------------------
Xuat phat tu dong v[i]+1, tim dong moi
co the dat duoc Hau i
-------------------------------------------------*)
function Tim(i: byte): Boolean;
begin
Tim := true;
while v[i] < n do
begin
inc(v[i]);
if DatDuoc(i) then exit;
end;
Tim := false;
end;
(*-------------------------------------------------
Hien thi nghiem tren man hinh
Cho bai toan tim mot nghiem
k=0: vo nghiem
k=n: co nghiem v[1..n]
-------------------------------------------------*)
procedure KetQua1(k: byte);
var i: byte;
begin
writeln;
if k=0 then write('Vo nghiem')
else
for i:=1 to k do write(v[i]:3);
writeln;
end;
(*-------------------------------------------------
Tim 1 nghiem: xep M quan hau tren ban
co M x M
-------------------------------------------------*)
procedure XepHau1(M: byte);
var i: byte;
begin
if (M < 1) or (M > MN) then exit;
{MN = 20 la gioi han kich thuoc ban co}
n := M;
{Khoi tri: Dat cac hau 1..N ngoai ban co.
Hau i dat tai dau cot i, i=1..N.}
for i := 1 to n do v[i] := 0;
i := 1; {Hau dang xet}
repeat
if i > n then {co nghiem v[1..n]}
begin
KetQua1(n);
exit;
end;
if i < 1 then {vo nghiem}
begin
KetQua1(0);
exit;
end;
if Tim(i) {co cach di}
then inc(i) {Tien}
else
begin {Lui}
v[i] := 0;
dec(i);
end;
until false;
end;
(*--------------------------------------------------
Ghi nghiem thu d vao tep g 'N_HAU.OUT'
Bai toan tim moi nghiem
--------------------------------------------------*)
procedure KetQua(d: integer);
var i: byte;
begin
write(g,'Nghiem thu ',d,': ');
for i := 1 to n do write(g,v[i],BL);
writeln(g);
end;
(*--------------------------------------------------
Tim moi cach dat M Hau tren ban co M x M
--------------------------------------------------*)
procedure XepHau(M: byte);
var
i: byte;
d: integer; {dem so nghiem}
begin
if (M<1) or (M>MN) then exit;
n := m;
for i := 1 to n do v[i] := 0;
assign(g,gn);
rewrite(g);
i := 1; {Hau dang xet}
d := 0; {Dem so nghiem}
repeat
if i > n then {Tim duoc 1 nghiem}
begin
inc(d);
KetQua(d); {v[1..n] la nghiem thu d}
i := 1; {gia sai}
end;
if i < 1 then {Tim het nghiem}
begin
writeln(g,'Tong cong ',d,' nghiem ');
close(g);
writeln('Xem ket qua torng file ',gn);
readln;
exit;
end;
if Tim(i) then inc(i)
else begin
v[i] := 0;
dec(i);
end;
until false;
end;
BEGIN
XepHau1(8); {tim 1 nghiem}
XepHau(8); {tim du 92 nghiem}
END.
|