188 lines
4.4 KiB
Python
188 lines
4.4 KiB
Python
def razdalja_povezava(x0, y0, x1, y1):
|
|
return abs(x1-x0) + abs(y1-y0)
|
|
|
|
def pravilna(povezava):
|
|
x0, y0, x1, y1 = povezava
|
|
# preveri dolzino
|
|
prekratka = razdalja_povezava(x0, y0, x1, y1) > 0
|
|
|
|
# preveri, da je vodoravna ali navpicna in ne diagonalna
|
|
diagonalna = (x0 == x1) or (y0 == y1)
|
|
|
|
return prekratka and diagonalna
|
|
|
|
def pravilne(povezave):
|
|
for i in povezave:
|
|
if not pravilna(i):
|
|
return False
|
|
|
|
return True
|
|
|
|
def urejena(povezava):
|
|
x0, y0, x1, y1 = povezava
|
|
|
|
if x1 < x0 or y1 < y0:
|
|
return x1, y1, x0, y0
|
|
|
|
return povezava
|
|
|
|
def na_povezavi(x, y, povezava):
|
|
x0, y0, x1, y1 = urejena(povezava)
|
|
|
|
return x0 <= x <= x1 and y0 <= y <= y1
|
|
|
|
def povezave_tocke(x, y, povezave):
|
|
r = set()
|
|
|
|
for i in povezave:
|
|
if na_povezavi(x, y, i):
|
|
r.add(urejena(i))
|
|
|
|
return r
|
|
|
|
def generiraj_tuples_povezava(povezava):
|
|
pov = []
|
|
|
|
x0, y0, x1, y1 = povezava
|
|
|
|
if x0 == x1:
|
|
z0 = y0
|
|
z1 = y1
|
|
else:
|
|
z0 = x0
|
|
z1 = x1
|
|
|
|
for i in range(z0, z1 + 1):
|
|
if x0 == x1:
|
|
r = (x0, i)
|
|
else:
|
|
r = (i, y0)
|
|
pov.append(r)
|
|
|
|
return pov
|
|
|
|
def secisce(povezava1, povezava2):
|
|
if not pravilna(povezava1) and not pravilna(povezava2): return None
|
|
|
|
pov1 = generiraj_tuples_povezava(urejena(povezava1))
|
|
pov2 = generiraj_tuples_povezava(urejena(povezava2))
|
|
|
|
for i in pov1:
|
|
for j in pov2:
|
|
if i == j:
|
|
return i
|
|
|
|
return None
|
|
|
|
def urejeni_povezavi(povezava1, povezava2):
|
|
pov1 = urejena(povezava1)
|
|
pov2 = urejena(povezava2)
|
|
|
|
x0_1, y0_1, x1_1, y1_1 = pov1
|
|
x0_2, y0_2, x1_2, y1_2 = pov2
|
|
|
|
if x0_1 < x0_2:
|
|
return pov1, pov2
|
|
elif x0_2 < x0_1:
|
|
return pov2, pov1
|
|
|
|
if y0_1 < y0_2:
|
|
return pov1, pov2
|
|
elif y0_2 < y0_1:
|
|
return pov2, pov1
|
|
|
|
if x1_1 < x1_2:
|
|
return pov1, pov2
|
|
elif x1_2 < x1_1:
|
|
return pov2, pov1
|
|
|
|
if y1_1 < y1_2:
|
|
return pov1, pov2
|
|
elif y1_2 < y1_1:
|
|
return pov2, pov1
|
|
|
|
# sigurno ne bosta dve identični povezavi prileteli sem? :D
|
|
if x0_1 == x0_2 and y0_1 == y0_2: return None
|
|
|
|
def krizisca(povezave):
|
|
krizisce = {}
|
|
|
|
for povezava1 in povezave:
|
|
povezava1 = urejena(povezava1)
|
|
|
|
for povezava2 in povezave:
|
|
povezava2 = urejena(povezava2)
|
|
|
|
# nočemo primerjati križišče s samim sabo
|
|
if povezava1 == povezava2:
|
|
continue
|
|
|
|
# sortiranje povezav
|
|
pov1, pov2 = urejeni_povezavi(povezava1, povezava2)
|
|
|
|
# preverimo če trenutni povezavi že obstajata v slovarju
|
|
if (pov1, pov2) in krizisce:
|
|
continue
|
|
|
|
# preverimo če najdemo sečišče
|
|
sec = secisce(pov1, pov2)
|
|
|
|
# če ga najdemo dodamo vnos v slovar
|
|
if sec is not None:
|
|
# drugi imeni spr samo zaradi manjša zmede, ker se lahko zamenjata
|
|
krizisce[(pov1, pov2)] = sec
|
|
|
|
return krizisce
|
|
|
|
def mozna_pot(pot, mreza):
|
|
for povezava in pot:
|
|
# dobimo urejeno povezavo
|
|
pov = urejena(povezava)
|
|
obstaja_pot = False
|
|
|
|
# preverimo če obstaja povezava v mreži
|
|
for x,y in mreza.keys():
|
|
if pov == x or pov == y:
|
|
obstaja_pot = True
|
|
break
|
|
|
|
# če ne obstaja pot takoj zaključi izvajanje
|
|
if not obstaja_pot:
|
|
return False
|
|
|
|
# to be continued, preveriti moramo še če se vse povezave stikajo skupaj
|
|
for i in range(0, len(pot)):
|
|
# preverjamo trenutno povezavo z naslednjo, zato
|
|
if i + 1 == len(pot): break
|
|
|
|
if secisce(pot[i], pot[i+1]) is None: return False
|
|
|
|
return True
|
|
|
|
def razdalja(pot, mreza):
|
|
skupna_razdalja = 0
|
|
|
|
povezava1, povezava2 = urejeni_povezavi(pot[0], pot[1])
|
|
sec = mreza[(povezava1, povezava2)] # ker imamo zagotovilo v navodilih, da ima pot vsaj dve povezavi
|
|
print(povezava1, povezava2)
|
|
|
|
for i in range(2, len(pot)):
|
|
# ker gledamo i za 1 vnaprej (torej tudi naslednjo pot)
|
|
if i + 1 == len(pot): break
|
|
|
|
x0, y0 = sec
|
|
|
|
povezava1, povezava2 = urejeni_povezavi(pot[i], pot[i+1])
|
|
trenutno_sec = mreza[(povezava1, povezava2)]
|
|
x1, y1 = trenutno_sec
|
|
|
|
skupna_razdalja += razdalja_povezava(x0, y0, x1, y1)
|
|
|
|
sec = trenutno_sec
|
|
|
|
return skupna_razdalja
|
|
|
|
def main():
|
|
print()
|
|
|
|
main() |