Problém osmi dam
Problém osmi dam se řadí mezi klasické problémy při výuce
programování. A proto nevidím důvod proč bychom se u něj neměli
pozastavit i my.
Zadání: Rozmístěte po šachovnici osm dam tak, aby se navzájem
neohrožovali. Tzn. každá bude v jiném řádku, sloupci a
příčce(=šikmice).
Algoritmus: Začínám s čistou šachovnicí. Na první řádek do prvního
sloupce položím dámu. Jdu na další řádek. Otestuju první políčko.
je-li ohroženo přesunu se na další. Když je dobrý du zas na další
řádku atd. Když se dostanu do posledního sloupce, jdu o řádek vejš a
tam se posunu o sloupec doprava.....
Kdo to pochopil je dobrej (já sem si to po sobě přečet a nepochopil
sem ani ň či jiný písmeno). Pro vás ostatní nakreslim diagram.
(upozorňuju: nejde o normální diagramy, ale o moje osobní, který sem
si teď vymyslel)
+---------+
| začátek |
+----+----+
+-----------------+-----------------+
| aktuální řádek je 1, sloupec taky |
+-----------------+-----------------+
+----------------------+---------------------+
++---------+ kontroluju aktuální políčko je-li ohroženo +-----------+
|| +------------+--------------------+----------+ |
|| +------+------+ +-------+-------+ |
|| | je ohroženo | | není ohroženo | |
|| +------+------+ +-------+-------+ |
|| +------------------+--------+ +---------+-------------------+ |
|| | posun na vedlejší políčko | | zaznamenám jdu o řádek dolu | |
|| +---+--------------+--------+ | na první políčko | |
||+------+-----++-------+--------+ +------+----------------+-----+ |
||| je vedlejší||není-li vedlejší|+-------+--------++------+-------+|
||| políčko || políčko ||není další řádek||je další řádek||
||+------+-----++-------+--------+| byl jsem na 8 |+------+-------+|
|+-------+ +------+-------+ +-------+--------+ +--------+
| | o řádek výše | +-------+--------+
| | a na políčko ++| vypíšu výsledek|
| | za dámou ||+--------+-------+
| ++---------+---++---------+
| +----+---+ +---+------+
| |je řádek| |není řádek|
| | výše | | výše |
| +----+---+ +----+-----+
+-----------------+ +--+--+
|KONEC|
+-----+
Realizace:
Vstup: Neni
Uložení dat: umístění dam na šachovnici se sice dá ukládat do
dvojrozměrného pole, ale protože v 1 řádku může být
jen 1 dáma může se také uložit do jednorozměrného
o osmi prvcích, kde pořadí prvku určuje řádek
a jeho hodnota sloupec.
Kontrola ohrožení políčka:
dá se udělat i takhle
{testuje je-li policko neohrozene}
function isclear(ar,ac:byte):boolean;
var c:byte;
begin
c:=0;
while (c<ar) do
begin
{ stejny sloupec or stejna uhlopricka}
if (chbd[c] = ac) or (abs(ac-chbd[c]) = abs(ar-c)) then begin
isclear:=false;
exit;
end;
inc(c);
end;
isclear:=true;
end;
Výstup: do souboru (viz. přiložený program)
Rychlost: program testuje 176585 pozic což by člověku testujícímu 1
políčko za sekundu trvalo něco málo pod 5 hodin. Můj
počítač to má asi za 300 milisekund
Počet řešení: 92, kupodivu se shoduje s literaturou.
A nyní už předkládám zmíněné programy. Jsou ve dvou versích
jedna končí na konci a druhá logicky uprostřed. Druhá verse je sice
méně elegantní, ale zase o pár milisekund rychlejší.
Pro Packalisty: verse 1 verse 2
Pro Céčkaře : verse 1 verse 2
HIPP
(použitá literatura:T. Ray Nanney : Computing a problem-solving with
Fortran 77)
výheň