import queue import sys fronta = [queue.Queue(), queue.Queue()] # mám zvlášť frontu pro krále a pro koně # definování sí některých užitečných konstant NENAVSTIVENO = -5 KRAL = 1 KUN = 0 POHYB_KONE = [{"radek": 2, "sloupec": 1}, {"radek": 2, "sloupec": -1}, {"radek":-2, "sloupec": 1}, {"radek":-2, "sloupec": -1}, {"radek": 1, "sloupec": 2}, {"radek":-1, "sloupec": 2}, {"radek": 1, "sloupec": -2}, {"radek":-1, "sloupec": -2}] POHYB_KRALE = [{"radek": 0, "sloupec": 1}, {"radek": 1, "sloupec": 1}, {"radek": 1, "sloupec": 0}, {"radek": 1, "sloupec": -1}, {"radek": 0, "sloupec": -1}, {"radek":-1, "sloupec": -1}, {"radek":-1, "sloupec": 0}, {"radek":-1, "sloupec": 1}] # načtení vstupu #(sirka, vyska, start i cil jsou vlastně konstanty, tak to zdůrazním velkými písmeny) radkaRozmeru = input().split() SIRKA = int(radkaRozmeru[0]) VYSKA = int(radkaRozmeru[1]) radkaStart = input().split() START_RADEK = int(radkaStart[0]) START_SLOUPEC = int(radkaStart[1]) radkaCil = input().split() CIL_RADEK = int(radkaCil[0]) CIL_SLOUPEC = int(radkaCil[1]) hraciDeska = [[[NENAVSTIVENO]*SIRKA for i in range(VYSKA)] for i in range(2)] # toto mi vyrobí pole o rozněrech 2xVYSKAxSIRKA a všude bude hodnota NENAVSTIVENO def jeVolno(radek, sloupec, hraciDeska): if(radek >= 0 and sloupec >= 0 and radek < VYSKA and sloupec < SIRKA): # kontrola, jestli jsme na hraciDesce return hraciDeska[radek][sloupec] == NENAVSTIVENO; else: return False; def rekonstrukceCesty(doselJako): stack = [{"radek": CIL_RADEK, "sloupec": CIL_SLOUPEC}] radek = CIL_RADEK sloupec = CIL_SLOUPEC kolo = hraciDeska[doselJako][radek][sloupec] while(radek != START_RADEK or sloupec != START_SLOUPEC): if(doselJako == KUN): for i in range(len(POHYB_KONE)): tmpRadek = radek + POHYB_KONE[i]["radek"] tmpSloupec = sloupec + POHYB_KONE[i]["sloupec"] if(hraciDeska[KRAL][tmpRadek][tmpSloupec] == kolo-1): # nasli jsme misto, ze ktereho mohl vyjit stack.append({"radek": tmpRadek, "sloupec": tmpSloupec}) radek = tmpRadek sloupec = tmpSloupec kolo = hraciDeska[KRAL][radek][sloupec] break doselJako = KRAL else: #doselJako = KRAL for i in range(len(POHYB_KRALE)): tmpRadek = radek + POHYB_KRALE[i]["radek"] tmpSloupec = sloupec + POHYB_KRALE[i]["sloupec"] if(hraciDeska[KUN][tmpRadek][tmpSloupec] == kolo-1): # nasli jsme misto, ze ktereho mohl vyjit stack.append({"radek": tmpRadek, "sloupec": tmpSloupec}) radek = tmpRadek sloupec = tmpSloupec kolo = hraciDeska[KUN][radek][sloupec] break doselJako = KUN while len(stack) > 0: print(stack.pop()) def pridejPoziceKone(aktualniPozice, hraciDeskaKone, kolo): radek = aktualniPozice["radek"] sloupec = aktualniPozice["sloupec"] for i in range(len(POHYB_KONE)): tmpRadek = radek + POHYB_KONE[i]["radek"] tmpSloupec = sloupec + POHYB_KONE[i]["sloupec"] if(jeVolno(tmpRadek, tmpSloupec, hraciDeskaKone)): hraciDeskaKone[tmpRadek][tmpSloupec] = kolo #poznacim si, ze jsem se na to misto prave ted dostal if(tmpSloupec == CIL_SLOUPEC and tmpRadek == CIL_RADEK): #došli jsme do cíle rekonstrukceCesty(KUN) sys.exit(0); # a úspěšně ukončíme program else: fronta[KUN].put({"radek": tmpRadek, "sloupec": tmpSloupec}) def pridejPoziceKrale(aktualniPozice, hraciDeskaKrale, kolo): radek = aktualniPozice["radek"] sloupec = aktualniPozice["sloupec"] for i in range(len(POHYB_KRALE)): tmpRadek = radek + POHYB_KRALE[i]["radek"] tmpSloupec = sloupec+POHYB_KRALE[i]["sloupec"] if(jeVolno(tmpRadek, tmpSloupec, hraciDeskaKrale)): hraciDeskaKrale[tmpRadek][tmpSloupec] = kolo #poznacim si, ze jsem se na to misto prave ted dostal if(tmpSloupec == CIL_SLOUPEC and tmpRadek == CIL_RADEK): rekonstrukceCesty(KRAL) sys.exit(0); # a úspěšně ukončíme program else: fronta[KRAL].put({"radek": tmpRadek, "sloupec": tmpSloupec}) kolo = 0; fronta[KRAL].put({"radek": START_RADEK, "sloupec": START_SLOUPEC}); hraciDeska[KRAL][START_RADEK][START_SLOUPEC] = 0 hraciDeska[KUN][START_RADEK][START_SLOUPEC] = 0 while(not fronta[KRAL].empty() or not fronta[KUN].empty()): #dokud nejsou obe dve fronty prazdne for i in [KRAL, KUN]: kolo = kolo + 1 while(not fronta[i].empty()): # dokud není fronta prázdná jdeme z míst, kam jsme se dostali aktualniPozice = fronta[i].get() if(i == KRAL): # došli jsme jako král, tedy pokračujeme jako kůň pridejPoziceKone(aktualniPozice, hraciDeska[KUN], kolo) else: # došli jsme jako kůň, tedy pokračujeme jako král pridejPoziceKrale(aktualniPozice, hraciDeska[KRAL], kolo)