2024-12-07 16:11:04 +01:00

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()