Last active
November 11, 2018 20:58
-
-
Save kpalin/a85a123125a98c176981f73e8cbb4ad5 to your computer and use it in GitHub Desktop.
Lasketaan 8x8 shakkilaudalla mahdollisten ei-uhkaavien kuningatarten asemien lukumäärät.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def valkoinenUhkaa(sarake,rivi,koko): | |
"""Palauttaa 'koko' x 'koko' kokoisen kaksiulotteisen listan 'lauta', jonka alkio on | |
1 joss kohdassa ('sarake','rivi') oleva shakkikuningatar uhkaa tai valloittaa | |
kyseistä alkiota. Muuten alkio on 0. | |
""" | |
# Alustetaan 2 ulotteinen taulukko/lista | |
lauta = [] | |
for i in range(koko): | |
lauta.append([0]*koko) | |
for i in range(koko): | |
# Rivi | |
lauta[sarake][i] = 1 | |
# Sarake | |
lauta[i][rivi] = 1 | |
# Diagonaalit | |
if sarake-i >= 0: | |
if rivi-i >= 0: | |
lauta[sarake-i][rivi-i] = 1 | |
if rivi+i < koko: | |
lauta[sarake-i][rivi+i] = 1 | |
if sarake+i < koko: | |
if rivi-i >= 0: | |
lauta[sarake+i][rivi-i] = 1 | |
if rivi+i < koko: | |
lauta[sarake+i][rivi+i] = 1 | |
return lauta | |
def laskeTurvalliset(lauta): | |
"Laskee 2 ulotteisen listan alkiot joiden arvo on 0" | |
turvalliset = 0 | |
for sarake in lauta: | |
for uhattu in sarake: | |
if uhattu==0: | |
turvalliset += 1 | |
return turvalliset | |
def tulostaLauta(lauta): | |
"Tulostaa laudan siten että lauta[0][0] on vasemmassa alanurkassa, shakkilaudan ruutu a1" | |
koko = len(lauta) | |
for i in range(koko): | |
rivi=koko-i-1 | |
s="" | |
for sarake in range(koko): | |
s=s+str(lauta[sarake][rivi]) | |
print(s) | |
def laskeKaikkiTurvalliset(koko): | |
"""Laskee 'koko'x'koko' kokoisella shakkilaudalla kaikkien mahdollisten kahden kuningattaren | |
sellaisten asemien lukumäärän, missä ne eivät uhkaa toisiaan. | |
""" | |
turvalliset = 0 | |
for rivi in range(koko): | |
for sarake in range(koko): | |
lauta = valkoinenUhkaa(sarake,rivi,koko) | |
turvalliset += laskeTurvalliset(lauta) | |
return turvalliset | |
if True: | |
turvalliset=0 | |
koko=8 | |
for vSarake in range(koko): | |
for vRivi in range(koko): | |
for mSarake in range(koko): | |
for mRivi in range(koko): | |
if not ( (mRivi==vRivi) or (mSarake==vSarake) or (mSarake-mRivi) == (vSarake-vRivi) or (mSarake+mRivi) == (vSarake+vRivi)): | |
turvalliset+=1 | |
print(turvalliset) | |
else: | |
print(laskeKaikkiTurvalliset(8)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Tämä on aika vaikea knoppitehtävä. Lopussa olevat sisäkkäiset loopit käyvät läpi valkoisen ja mustan kuningattaren asemat ja pitkä if-lause tarkistaa uhkaavatko ne toisiaan vai eivät. Mikään näistä ratkaisuista ei ole suositeltava!