def pravilna(povezava): x0, y0, x1, y1 = povezava # preveri dolzino prekratka = (abs(x1-x0) + abs(y1-y0)) > 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): x0_1, y0_1, x1_1, y1_1 = urejena(povezava1) x0_2, y0_2, x1_2, y1_2 = urejena(povezava2) if x0_1 < x0_2: return povezava1, povezava2 elif x0_2 < x0_1: return povezava2, povezava1 if y0_1 < y0_2: return povezava1, povezava2 elif y0_2 < y0_1: return povezava2, povezava1 if x1_1 < x1_2: return povezava1, povezava2 elif x1_2 < x1_1: return povezava2, povezava1 if y1_1 < y1_2: return povezava1, povezava2 elif y1_2 < y1_1: return povezava2, povezava1 # 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): povezave_obstajajo = True 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 def main(): povezave = [ (11, 10, 13, 10), (2, 12, 8, 12), (6, 11, 6, 13), (0, 16, 10, 16), (3, 18, 3, 13), (7, 14, 3, 14), (9, 17, 9, 14), ] pov = [ (11, 10, 13, 10), (2, 12, 8, 12), (6, 11, 6, 13), (0, 16, 10, 16), (3, 18, 3, 13), (7, 14, 3, 14), (9, 17, 9, 14), (13, 15, 8, 15), (12, 14, 12, 17), (13, 16, 21, 16), (14, 18, 14, 15), (13, 15, 13, 16), (16, 16, 16, 10), (16, 10, 21, 10), (14, 18, 10, 18), (11, 13, 11, 20), (15, 13, 22, 13), (17, 15, 17, 17), (18, 17, 18, 14), (19, 19, 22, 19), (20, 15, 20, 17), (21, 10, 21, 19), ] mreza = krizisca(pov) print("Mreža:\n") for i, j in mreza.items(): print(f"{i}: {j}") print("\n") klic = mozna_pot( [(14, 18, 10, 18), (14, 18, 14, 15), (13, 16, 21, 16), (13, 16, 13, 15), (8, 15, 13, 15), (9, 14, 9, 17), (10, 16, 0, 16), (9, 14, 9, 17), (8, 15, 13, 15), (13, 16, 13, 15)], mreza) #print(klic) main()