######################################################################## ## 6. prednaska ## ## Prakticka uloha - uloha 25-2-5: Sbírání papírů ## ## http://ksp.mff.cuni.cz/viz/25-2-5 ######################################################################## import math leva = {} prava = {} radku = 0 sloupcu = 0 def main(): # Prikaz pro otevreni souboru pro cteni - prepinac "-r" # Zdvojena lomitkas kvuli escapovani (lomitko by jinak escapovalo # nasledujici znak) vstup = open("D:\\python\\vstup.txt", 'r') # Nacitani vstupu ################################# global radku global sloupcu global leva global prava # Nacteme radek a rozdelime ho podle mezer na dve hodnoty # Ty pak priradime do dvou promennych (tedy do seznamu dvou promennych, # syntakticky trik) (radku, sloupcu) = vstup.readline().strip().split(" ") # Tady je jen jedna hodnota na radku, tedy ji jen osekame o koncove # bile znaky (mezery, znaky noveho radku, ...) start_x = int(vstup.readline().strip()) matice = [] for i in range(int(radku)): radek_pole = vstup.readline().strip().split(" ") #print radek_pole matice.append(radek_pole) # Do globalnich poli si ulozime prvni a posledni pozice papiru v radku # -- projdeme vzdy cely radek leva[i] = -1 prava[i] = -1 for j in range(len(radek_pole)): if(int(radek_pole[j]) == 1): if(leva[i] == -1): leva[i] = j prava[i] = j # Konec nacitani vstupu ########################### vstup.close() print matice # zeptame se na vysledek print start_x print spocitej(start_x, 0) # Funkce pocitajici nejlepsi cestu skrz nactenou matici # Dostane parametr, kudy jsme na radek vstoupili a jaky radek to je a vrati # nam hodnotu, za jakou nejmensi cenu jsme schopni zbytek matice projit # (vola se rekurzivne) # UKOL NA DOMA: Predelat, aby si neco pamatovala a nepocitala rekurzivne stale # to same dokola (ted bezi v case O(2^n)) def spocitej(kudy, radek): global leva global prava global radku cena = 0 print "Pocitam pro kudy=", kudy, "a radek=", radek, radku # Zarazka: az opustime kancelar, tak uz skoncime :) if int(radek) == int(radku): return 0 # Jednotlive situace: if leva[radek] == -1: # 1) Tento radek je prazdny, jen ho prejdeme print "...jdu niz" cena = spocitej(kudy, radek+1) + 1 elif kudy > prava[radek]: # 2) Urcite dojdeme az k leve a pak sestoupime dolu print "...jdu urcite vlevo" cena = kudy - leva[radek] + spocitej(leva[radek], radek+1) elif kudy < leva[radek]: # 3) Urcite dojdeme az k prave a pak sestoupime dolu print "...jdu urcite vpravo" cena = prava[radek] - kudy + spocitej(prava[radek], radek+1) else: # 4) Nejslozitejsi pripad, zkusime se vydat obema smery print "...rozhoduji se" cena_leva = (prava[radek]-kudy) + (prava[radek]-leva[radek]) + spocitej(leva[radek], radek+1) cena_prava = (kudy-leva[radek]) + (prava[radek]-leva[radek]) + spocitej(prava[radek], radek+1) if cena_leva < cena_prava: cena = cena_leva else: cena = cena_prava cena += 1 # Jeste musime zapocitat presun o jedno policko pri presunu na dalsi radek ;-) print "Idealni cena pro radek", radek, "a vstup", kudy, "je", cena return cena if __name__ == '__main__': main()