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.
Səkkiz vəzir problemi bizdən şahmat taxtasında səkkiz vəziri biri digərini vurmayacaq şəkildə yerləşdirməyi tələb edir. Yəni: eyni sıra, sütün və diaqonalda yalnız 1 vəzir ola bilər.

 Tarixi 
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ə n×n halına salmışdır.

 Məsələnin həlli 
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 
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 
 Digər proqramlaşdırma dillərində təsviri
 Java tətbiqetmə ilə ümumi metod n queens

Kateqoriya:Şahmat