Úvodní stránka | Tato stránka v originále

Osm hádanky královen

osm hádanky královen je problém umístění osm šachy queenss na šachovnici 8x8 takový že žádný z nich je schopný zachytit nějaké jiné používání standardní šachová královna je pohyby. (barva kusu je ignorována a nějaký kus je převzat být schopný napadnout některého jiný.) to má říkat, žádné dvě královny by měly sdílet stejný řádek, sloupec nebo úhlopříčku.

Tato hádanka byla použita v populárních časných devadesátých létech počítačová hra, 7. host. Nicméně, to má bohatou historii antedatovat tuto hru; celkový problém umístění n “non-dominující” královny na n n šachovnice byla předstírána brzy jak 1850.

Osm problém královen má 92 zřetelných řešení, nebo 12 zřetelných řešení jestliže operace symetrie takový jak rotace a odrazy tabule jsou zaujatý do uvažování.

Tabulka s obsahem
1 osm hádanky královen jako problém příkladu pro design algoritmu
2 program příkladu v Python
3 vidět také
4 vnější spojení

Osm hádanky královen jako problém příkladu pro design algoritmu

Osm hádanka královen je dobrý příklad jednoduchý ale non-triviální problém, který může být řešen rekurzivní algoritmus, formulací n- problém královny inductively v podmínkách připočítání jediná královna k nějakému řešení k (n- 1) - problém královny. přerušení dolní části ven s řešením k 0-problém královny, který je prázdná šachovnice.

Tato technika je hodně účinnější než naivní hovado-hledání síly algoritmus, který zvažuje všech 648 = 248 možná slepá umístění osm královen, a pak filtruje tyto odstranit všechna umístění, která umístí dvě královny jeden na stejném čtverci nebo ve vzájemně útočících pozicích. Tato velmi chudá algoritmická vůle, mezi jiné věci, dosáhnout stejných výsledků přes a znovu ve všech různých obměnách převodů osmi královen, stejně jako opakování stejný počítání přes a znovu pro různého náhradníka-soubory každého řešení. Mírně lepší hovado-algoritmus síly umístí jedinou královnu na každém řádku, vést k jen 88 = 224 oslepit umístění.

To je často používáno jako problém příkladu pro non-tradiční přístupy, takový jako programování omezení, logické programování nebo genetické algoritmy.

Program příkladu v Python

Viz též: Python programovací jazyk

Toto používá nahlédnutí to

# Vrátit seznam řešení k n-problém královen na # n-- tabule šířky. Řešená tabule je vyjádřena jako seznam # pozice sloupce pro královny, indexovaný řadou. Řádky a sloupce jsou # indexovaný od nuly. def n _ královny (n, šířka): jestliže n = = 0: návrat # jedno řešení, prázdný seznam jinde: návrat sčítat _ královna (n-1, šířka, n _ královny (n-1, šířka ))

# Zkoušet všechny způsoby, jak přidat královnu ke sloupu řady nový _ řada, vracet se # seznam řešení. předchozí _ řešení musí být seznam nový _ řada-královny # řešení. def dodají _ královna (nový _ řada, šířka, předchozí _ řešení): řešení = [] pro sol v předchozí _ řešení: # pokusit se dát královnu na každý sloupec na řadě nový _ řada. pro nový _ col v dosahu (šířka): # tisk ' namáhavý ', nový _ col, ' na řadě ', nový _ řada jestliže bezpečný _ královna (nový _ řada, nový _ col, sol): # žádné rušení, tak přidat toto řešení seznamu. solutions.append (sol + [nový _ col ]) řešení návratu

# Je to bezpečné přidat královnu k sol u (nový _ řada, nový _ col)? Návrat # opravdové iff tak. sol musí být řešení k nový _ řada-problém královen. def bezpečný _ královna (nový _ řada, nový _ col, sol): # kontrola proti každému kusu na každém nový _ veslovat na existujících řadách. pro řádek v dosahu (nový _ řada): jestliže (sol [se hádají] = = nový _ col nebo sol [se hádají] + řada = = nový _ col + nový _ řádek nebo sol [se hádají] - řada = = nový _ col - nový _ řada): vrátit 0 návratu 1

pro sol v n _ královny (8, 8): sol tisku

Viz též

Externí odkazy

Spojení na řešení