Səkkiz vəzir problemi

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

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.

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ə | mənbəni redaktə et]

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ə | mənbəni redaktə et]
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ə | mənbəni redaktə et]