Səkkiz vəzir problemi

Vikipediya, açıq ensiklopediya
Keçid et: naviqasiya, axtar

[Mənbə göstərin]

Rekursiv alqortim ilə məsələnin həlli

Səkkiz vəzir problemi — Şahmat taxtasında səkkiz vəzirin bir-birini vurmadan necə yerləşdiriləcəyini müzakirə edən problemdir.

Səkkiz vəzir problemi daha ümumi olan n vəzir probleminin xüsusi halıdır. n vəzir problemi nxn ölçülü şahmat taxtasında n sayda vəzirinin bir-birini vurmadan necə yerləşdirilməsi haqqında olan problemdir.

Tarixi[redaktə]

Bu problem ilk dəfə 1848-ci ildə şahmat oyunçusu Max Bezzel tərəfindən ortaya atılmışdır. Daha sonra Qauss, Qeorq Kantor tərəfindən haqqında araşdırmalar aparılmışdır. Məsələnin ilk həlli 1850-ci ildə F.Nauck tərəfindən verilmişdir. Həmçinin Nauck məsələni daha qlobal bir şəkilə nxn halına salmışdır.

Məsələnin Həlli[redaktə]

Sekkiz vezir problemi.png

Səkkiz vəzir probleminin 92 həll yolu vardır. Digər həllər yuxarıdakı on iki həllin simmetrik çevrilməsi nəticəsində yaradılmışdır.

N vəzir problemi hələlik 26-a kimi həll edilmişdir. 27 və sonrası yüksək hesablama gücü tələb etdiyinə görə hələlik həll edilməmişdir.

Pascal proqramlaşdırma dilində həlli[redaktə]

program eightqueen1(output);
 
var i : integer; q : boolean;
    a : array[ 1 .. 8] of boolean;
    b : array[ 2 .. 16] of boolean;
    c : array[ -7 .. 7] of boolean;
    x : array[ 1 .. 8] of integer;
 
procedure try( i : integer; var q : boolean);
    var j : integer;
    begin 
    j := 0;
    repeat 
        j := j + 1; 
        q := false;
        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
                begin
                try( i + 1, q);
                if not q then
                    begin 
                    a[ j] := true; 
                    b[ i + j] := true; 
                    c[ i - j] := true;
                    end
                end 
            else 
                q := true
            end
    until q or (j = 8);
    end;
 
begin
for i :=  1 to  8 do a[ i] := true;
for i :=  2 to 16 do b[ i] := true;
for i := -7 to  7 do c[ i] := true;
try( 1, q);
if q then
    for i := 1 to 8 do write( x[ i]:4);
writeln
end.

Həmçinin bax[redaktə]

Xarici Keçidlər[redaktə]