#!/usr/bin/env python
# coding=utf-8
import math
from copy import deepcopy
zrkadla = []
C = (42,0)
H = 8
def dist(poz1, poz2, smer):
if smer == 'h' or smer == 'd':
return
abs(poz1
[1] - poz2
[1]) else:
return
abs(poz1
[0] - poz2
[0])
def trafi(poz, smer, z):
if smer == "h":
return poz[0] == z[0] and poz[1] < z[1]
elif smer == "d":
return poz[0] == z[0] and poz[1] > z[1]
elif smer == "p":
return poz[1] == z[1] and poz[0] < z[0]
else:
return poz[1] == z[1] and poz[0] > z[0]
def pretinaZrkadlo(poz, smer):
trafeneZrkadlo = -1
d = 0
for i in range(len(zrkadla)):
if trafi(poz, smer, zrkadla[i]):
tmp = dist(zrkadla[i],poz, smer)
if trafeneZrkadlo == -1 or tmp < d:
trafeneZrkadlo = i
d = dist(zrkadla[trafeneZrkadlo], poz, smer)
return trafeneZrkadlo
def trafiCiel(poz, smer):
return trafi(poz, smer, C)
def solveA(natocenie, z, smer, path, depth):
if natocenie[z][0]:
if natocenie[z][1] == "A":
path+='A'
if smer == "h":
return solve(natocenie, zrkadla[z], "l", path, depth + 1)
elif smer == "d":
return solve(natocenie, zrkadla[z], "p", path, depth + 1)
elif smer == "p":
return solve(natocenie, zrkadla[z], "d", path, depth + 1)
else:
return solve(natocenie, zrkadla[z], "h", path, depth + 1)
else:
natocenie[z][1] = 'A'
path+='A'
if smer == "h":
return solve(natocenie, zrkadla[z], "l", path, depth + 1)
elif smer == "d":
return solve(natocenie, zrkadla[z], "p", path, depth + 1)
elif smer == "p":
return solve(natocenie, zrkadla[z], "d", path, depth + 1)
else:
return solve(natocenie, zrkadla[z], "h", path, depth + 1)
def solveB(natocenie, z, smer, path, depth):
if natocenie[z][0]:
if natocenie[z][1] == "B":
path+='B'
if smer == "h":
return solve(natocenie, zrkadla[z], "p", path, depth + 1)
elif smer == "d":
return solve(natocenie, zrkadla[z], "l", path, depth + 1)
elif smer == "p":
return solve(natocenie, zrkadla[z], "h", path, depth + 1)
else:
return solve(natocenie, zrkadla[z], "d", path, depth + 1)
else:
natocenie[z][1] = 'B'
path+='B'
if smer == "h":
return solve(natocenie, zrkadla[z], "p", path, depth + 1)
elif smer == "d":
return solve(natocenie, zrkadla[z], "l", path, depth + 1)
elif smer == "p":
return solve(natocenie, zrkadla[z], "h", path, depth + 1)
else:
return solve(natocenie, zrkadla[z], "d", path, depth + 1)
def solve(natocenie, poz, smer, cesta, hlbka):
trafeneZ = pretinaZrkadlo(poz, smer)
if trafiCiel(poz, smer):
if trafeneZ != -1:
if dist(poz, C, smer) < dist(poz, zrkadla[trafeneZ], smer):
return cesta
else:
return cesta
if hlbka < H and trafeneZ != -1:
A = solveA(deepcopy(natocenie), trafeneZ, smer, deepcopy(cesta), hlbka)
B = solveB(deepcopy(natocenie), trafeneZ, smer, deepcopy(cesta), hlbka)
if A == None: A = "X" * (H + 1)
if B == None: B = "X" * (H + 1)
if len(A) == len(B):
return min(A,B)
if len(A) < len(B):
return A
else:
return B
else:
return "X" * (H + 1)
if __name__ == "__main__":
f
= open("P2
-input
.txt"
,"r"
) for line in f:
a = map(int, line.split())
if len(a) > 0:
zrkadla.append(a)
natocenie = [[False, "A"] for i in range(len(zrkadla))]
sol = "X"
while sol[0] == "X":
sol = solve(natocenie, [0,0], "h", "", 0)
H += 1
print sol
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiMgY29kaW5nPXV0Zi04CmltcG9ydCBtYXRoCmZyb20gY29weSBpbXBvcnQgZGVlcGNvcHkKCnpya2FkbGEgPSBbXQoKQyA9ICg0MiwwKQpIID0gOApkZWYgZGlzdChwb3oxLCBwb3oyLCBzbWVyKToKICAgIGlmIHNtZXIgPT0gJ2gnIG9yIHNtZXIgPT0gJ2QnOgogICAgICAgIHJldHVybiBhYnMocG96MVsxXSAtIHBvejJbMV0pCiAgICBlbHNlOgogICAgICAgIHJldHVybiBhYnMocG96MVswXSAtIHBvejJbMF0pCgpkZWYgdHJhZmkocG96LCBzbWVyLCB6KToKICAgIGlmICAgc21lciA9PSAiaCI6CiAgICAgICAgcmV0dXJuIHBvelswXSA9PSB6WzBdIGFuZCBwb3pbMV0gPCB6WzFdCiAgICBlbGlmIHNtZXIgPT0gImQiOgogICAgICAgIHJldHVybiBwb3pbMF0gPT0gelswXSBhbmQgcG96WzFdID4gelsxXQogICAgZWxpZiBzbWVyID09ICJwIjoKICAgICAgICByZXR1cm4gcG96WzFdID09IHpbMV0gYW5kIHBvelswXSA8IHpbMF0KICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHBvelsxXSA9PSB6WzFdIGFuZCBwb3pbMF0gPiB6WzBdCgpkZWYgcHJldGluYVpya2FkbG8ocG96LCBzbWVyKToKICAgIHRyYWZlbmVacmthZGxvID0gLTEKICAgIGQgPSAwCiAgICBmb3IgaSBpbiByYW5nZShsZW4oenJrYWRsYSkpOgogICAgICAgIGlmIHRyYWZpKHBveiwgc21lciwgenJrYWRsYVtpXSk6CiAgICAgICAgICAgIHRtcCA9IGRpc3QoenJrYWRsYVtpXSxwb3osIHNtZXIpCiAgICAgICAgICAgIGlmIHRyYWZlbmVacmthZGxvID09IC0xIG9yIHRtcCA8IGQ6CiAgICAgICAgICAgICAgICB0cmFmZW5lWnJrYWRsbyA9IGkKICAgICAgICAgICAgICAgIGQgPSBkaXN0KHpya2FkbGFbdHJhZmVuZVpya2FkbG9dLCBwb3osIHNtZXIpCiAgICByZXR1cm4gdHJhZmVuZVpya2FkbG8KCmRlZiB0cmFmaUNpZWwocG96LCBzbWVyKToKICAgIHJldHVybiB0cmFmaShwb3osIHNtZXIsIEMpCgpkZWYgc29sdmVBKG5hdG9jZW5pZSwgeiwgc21lciwgcGF0aCwgZGVwdGgpOgogICAgaWYgbmF0b2NlbmllW3pdWzBdOgogICAgICAgIGlmIG5hdG9jZW5pZVt6XVsxXSA9PSAiQSI6CiAgICAgICAgICAgIHBhdGgrPSdBJwogICAgICAgICAgICBpZiBzbWVyID09ICJoIjoKICAgICAgICAgICAgICAgIHJldHVybiBzb2x2ZShuYXRvY2VuaWUsIHpya2FkbGFbel0sICJsIiwgcGF0aCwgZGVwdGggKyAxKQogICAgICAgICAgICBlbGlmIHNtZXIgPT0gImQiOgogICAgICAgICAgICAgICAgcmV0dXJuIHNvbHZlKG5hdG9jZW5pZSwgenJrYWRsYVt6XSwgInAiLCBwYXRoLCBkZXB0aCArIDEpCiAgICAgICAgICAgIGVsaWYgc21lciA9PSAicCI6CiAgICAgICAgICAgICAgICByZXR1cm4gc29sdmUobmF0b2NlbmllLCB6cmthZGxhW3pdLCAiZCIsIHBhdGgsIGRlcHRoICsgMSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBzb2x2ZShuYXRvY2VuaWUsIHpya2FkbGFbel0sICJoIiwgcGF0aCwgZGVwdGggKyAxKQogICAgZWxzZToKICAgICAgICBuYXRvY2VuaWVbel1bMF0gPSBUcnVlCiAgICAgICAgbmF0b2NlbmllW3pdWzFdID0gJ0EnCiAgICAgICAgcGF0aCs9J0EnCiAgICAgICAgaWYgc21lciA9PSAiaCI6CiAgICAgICAgICAgIHJldHVybiBzb2x2ZShuYXRvY2VuaWUsIHpya2FkbGFbel0sICJsIiwgcGF0aCwgZGVwdGggKyAxKQogICAgICAgIGVsaWYgc21lciA9PSAiZCI6CiAgICAgICAgICAgIHJldHVybiBzb2x2ZShuYXRvY2VuaWUsIHpya2FkbGFbel0sICJwIiwgcGF0aCwgZGVwdGggKyAxKQogICAgICAgIGVsaWYgc21lciA9PSAicCI6CiAgICAgICAgICAgIHJldHVybiBzb2x2ZShuYXRvY2VuaWUsIHpya2FkbGFbel0sICJkIiwgcGF0aCwgZGVwdGggKyAxKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzb2x2ZShuYXRvY2VuaWUsIHpya2FkbGFbel0sICJoIiwgcGF0aCwgZGVwdGggKyAxKQoKZGVmIHNvbHZlQihuYXRvY2VuaWUsIHosIHNtZXIsIHBhdGgsIGRlcHRoKToKICAgIGlmIG5hdG9jZW5pZVt6XVswXToKICAgICAgICBpZiBuYXRvY2VuaWVbel1bMV0gPT0gIkIiOgogICAgICAgICAgICBwYXRoKz0nQicKICAgICAgICAgICAgaWYgc21lciA9PSAiaCI6CiAgICAgICAgICAgICAgICByZXR1cm4gc29sdmUobmF0b2NlbmllLCB6cmthZGxhW3pdLCAicCIsIHBhdGgsIGRlcHRoICsgMSkKICAgICAgICAgICAgZWxpZiBzbWVyID09ICJkIjoKICAgICAgICAgICAgICAgIHJldHVybiBzb2x2ZShuYXRvY2VuaWUsIHpya2FkbGFbel0sICJsIiwgcGF0aCwgZGVwdGggKyAxKQogICAgICAgICAgICBlbGlmIHNtZXIgPT0gInAiOgogICAgICAgICAgICAgICAgcmV0dXJuIHNvbHZlKG5hdG9jZW5pZSwgenJrYWRsYVt6XSwgImgiLCBwYXRoLCBkZXB0aCArIDEpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gc29sdmUobmF0b2NlbmllLCB6cmthZGxhW3pdLCAiZCIsIHBhdGgsIGRlcHRoICsgMSkKICAgIGVsc2U6CiAgICAgICAgbmF0b2NlbmllW3pdWzBdID0gVHJ1ZQogICAgICAgIG5hdG9jZW5pZVt6XVsxXSA9ICdCJwogICAgICAgIHBhdGgrPSdCJwogICAgICAgIGlmIHNtZXIgPT0gImgiOgogICAgICAgICAgICByZXR1cm4gc29sdmUobmF0b2NlbmllLCB6cmthZGxhW3pdLCAicCIsIHBhdGgsIGRlcHRoICsgMSkKICAgICAgICBlbGlmIHNtZXIgPT0gImQiOgogICAgICAgICAgICByZXR1cm4gc29sdmUobmF0b2NlbmllLCB6cmthZGxhW3pdLCAibCIsIHBhdGgsIGRlcHRoICsgMSkKICAgICAgICBlbGlmIHNtZXIgPT0gInAiOgogICAgICAgICAgICByZXR1cm4gc29sdmUobmF0b2NlbmllLCB6cmthZGxhW3pdLCAiaCIsIHBhdGgsIGRlcHRoICsgMSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc29sdmUobmF0b2NlbmllLCB6cmthZGxhW3pdLCAiZCIsIHBhdGgsIGRlcHRoICsgMSkKCmRlZiBzb2x2ZShuYXRvY2VuaWUsIHBveiwgc21lciwgY2VzdGEsIGhsYmthKToKICAgIHRyYWZlbmVaID0gcHJldGluYVpya2FkbG8ocG96LCBzbWVyKQoKICAgIGlmIHRyYWZpQ2llbChwb3osIHNtZXIpOgogICAgICAgIGlmIHRyYWZlbmVaICE9IC0xOgogICAgICAgICAgICBpZiBkaXN0KHBveiwgQywgc21lcikgPCBkaXN0KHBveiwgenJrYWRsYVt0cmFmZW5lWl0sIHNtZXIpOgogICAgICAgICAgICAgICAgcmV0dXJuIGNlc3RhCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIGNlc3RhCgogICAgaWYgaGxia2EgPCBIIGFuZCB0cmFmZW5lWiAhPSAtMToKICAgICAgICBBID0gc29sdmVBKGRlZXBjb3B5KG5hdG9jZW5pZSksIHRyYWZlbmVaLCBzbWVyLCBkZWVwY29weShjZXN0YSksIGhsYmthKQogICAgICAgIEIgPSBzb2x2ZUIoZGVlcGNvcHkobmF0b2NlbmllKSwgdHJhZmVuZVosIHNtZXIsIGRlZXBjb3B5KGNlc3RhKSwgaGxia2EpCiAgICAgICAgaWYgQSA9PSBOb25lOiBBID0gIlgiICogKEggKyAxKQogICAgICAgIGlmIEIgPT0gTm9uZTogQiA9ICJYIiAqIChIICsgMSkKICAgICAgICBpZiBsZW4oQSkgPT0gbGVuKEIpOgogICAgICAgICAgICByZXR1cm4gbWluKEEsQikKICAgICAgICBpZiBsZW4oQSkgPCBsZW4oQik6CiAgICAgICAgICAgIHJldHVybiBBCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIEIKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuICJYIiAqIChIICsgMSkKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBmID0gb3BlbigiUDItaW5wdXQudHh0IiwiciIpCiAgICBmb3IgbGluZSBpbiBmOgogICAgICAgIGEgPSBtYXAoaW50LCBsaW5lLnNwbGl0KCkpCiAgICAgICAgaWYgbGVuKGEpID4gMDoKICAgICAgICAgICAgenJrYWRsYS5hcHBlbmQoYSkKICAgIGYuY2xvc2UoKQogICAgbmF0b2NlbmllID0gW1tGYWxzZSwgIkEiXSBmb3IgaSBpbiByYW5nZShsZW4oenJrYWRsYSkpXQogICAgCiAgICBzb2wgPSAiWCIKICAgIHdoaWxlIHNvbFswXSA9PSAiWCI6CiAgICAgICAgc29sID0gc29sdmUobmF0b2NlbmllLCBbMCwwXSwgImgiLCAiIiwgMCkKICAgICAgICBIICs9IDEKICAgIAogICAgcHJpbnQgc29sCg==