Səkkiz vəzir problemi

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 n×n ölçülü şahmat taxtasında n sayda vəzirinin bir-birini vurmadan necə yerləşdirilməsi haqqında olan problemdir.

Həll yollarından biri: a7, b4, c2, d8, e6, f1, g3, h5:(87)

Bu problem ilk dəfə 1848-ci ildə şahmat oyunçusu Maks 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ə

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.

Xarici keçidlər

redaktə