Advertisement
Guest User

Untitled

a guest
Jan 24th, 2020
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.21 KB | None | 0 0
  1. import math
  2. import copy
  3. from pprint import pprint
  4.  
  5. def read_from_file():
  6. file = open("input.txt", "r")
  7. first_line = file.readline()
  8. raza = int(first_line)
  9. # print("Raza este: {} ".format(raza))
  10.  
  11. second_line = file.readline()
  12. greutate = int(second_line)
  13. # print("Greutatea broscutei este: {}".format(greutate))
  14.  
  15. third_line = file.readline().rstrip()
  16. start = third_line
  17. # print("Id-ul frunzei de start: {}".format(start))
  18.  
  19. # pentru fiecare frunza avem un dictionar in care ii punem caracteristicile
  20. # cheia este reprezentata de id si valoarea de o lista cu celelalte caracteristici
  21. frunze = []
  22. coordonate = {}
  23. greutati = {}
  24. nr_insecte = {}
  25. for line in file.readlines():
  26. line = line.split()
  27. frunze.append(line[0])
  28. coordonate[line[0]] = (int(line[1]), int(line[2]))
  29. nr_insecte[line[0]] = int(line[3])
  30. greutati[line[0]] = int(line[4])
  31.  
  32. return raza, greutate, start, frunze, coordonate, nr_insecte, greutati;
  33.  
  34.  
  35. class Frunza:
  36. def __init__(self, id, coordonate, nr_insecte, greutate_actuala, frunza_parinte):
  37. self.id = id
  38. self.coordonate = coordonate
  39. self.nr_insecte = nr_insecte
  40. self.greutate_actuala = greutate_actuala
  41. self.frunza_parinte = frunza_parinte
  42.  
  43. def obtineDrum(self):
  44. drum = [self.id]
  45. frunza = self
  46. while frunza.frunza_parinte is not None:
  47. drum.insert(0, frunza.frunza_parinte.id)
  48. frunza = frunza.frunza_parinte
  49. return drum
  50.  
  51. def contineInDrum(self, frunza_noua_id):
  52. frunza = self
  53. while frunza is not None:
  54. if frunza.id == frunza_noua_id:
  55. return True
  56. frunza = frunza.frunza_parinte
  57. return False
  58.  
  59. def __repr__(self):
  60. sir = "Broscuta cu id-ul "
  61. sir += self.id
  62. return sir
  63.  
  64. def afisDrum(self): # returneaza si lungimea drumului
  65. l = self.obtineDrum()
  66. sir = ""
  67. sir += (("->").join(l))
  68. return sir
  69.  
  70. def costNodCurent(self):
  71. parinte = self.frunza_parinte
  72. cost_total = 0
  73. while parinte is not None:
  74. cost = 0
  75. drum = self.obtineDrum()
  76. for frunza in drum:
  77. cost += 1
  78. cost -= self.nr_insecte[frunza]
  79. cost_total += cost
  80. parinte = parinte.frunza_parinte
  81. return cost_total
  82.  
  83.  
  84. def calculLungime(x1, y1, x2, y2):
  85. return math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
  86.  
  87.  
  88. class Graph:
  89. # start va fi id-ul frunzei initiale pe care se afla broscuta
  90. # greutate va fi greutatea broscutei
  91. # raza = raza lacului
  92. # dictionarul de frunze
  93.  
  94. def __init__(self, raza, start, greutate_initiala, frunze, coordonate, nr_insecte, greutati):
  95. self.raza = raza
  96. self.start = start
  97. self.greutate = greutate_initiala
  98. self.frunze = frunze
  99. self.coordonate = coordonate
  100. self.nr_insecte = nr_insecte
  101. self.greutati = greutati
  102.  
  103. def genereazaSuccesori(self, frunzaCurenta):
  104. listaSuccesori = []
  105. for id in frunze:
  106. if id == frunzaCurenta.id:
  107. continue
  108. lungime = calculLungime(self.coordonate[id][0], self.coordonate[id][1],
  109. self.coordonate[frunzaCurenta.id][0],
  110. self.coordonate[frunzaCurenta.id][1])
  111.  
  112. # pentru fiecare frunza pe care inca nu a sarit veirific daca poate sa sara
  113. if lungime <= frunzaCurenta.greutate_actuala / 3 and not frunzaCurenta.contineInDrum(id):
  114. # greutatea maxima adimisa de frunza pe care sare si nr de insecte
  115. # pe care le poseda
  116. greutate_max_frunza = self.greutati[id]
  117. nr_insecte_succesor = frunzaCurenta.nr_insecte[id]
  118.  
  119. # updatez greutatea in functie de cate insecte poate sa manance
  120. # avand in vedere ca nu poate depasi greutatea adimisa de frunza
  121.  
  122. greutate_noua = frunzaCurenta.greutate_actuala - 1
  123. nr_insecte_frunza_noua = copy.deepcopy(frunzaCurenta.nr_insecte)
  124. while greutate_noua <= greutate_max_frunza and nr_insecte_succesor > 0:
  125. greutate_noua += 1
  126. nr_insecte_succesor -= 1
  127.  
  128. nr_insecte_frunza_noua[id] = nr_insecte_succesor
  129.  
  130. frunza_noua = Frunza(id, coordonate[id], nr_insecte_frunza_noua, greutate_noua, frunzaCurenta)
  131. listaSuccesori.append(frunza_noua)
  132. return listaSuccesori
  133.  
  134. def verificaScop(self, frunzaCurenta):
  135. distanta = calculLungime(0, 0, self.coordonate[frunzaCurenta.id][0], self.coordonate[frunzaCurenta.id][1])
  136. distantaRamasa = self.raza - distanta
  137.  
  138. return distantaRamasa <= frunzaCurenta.greutate_actuala / 3
  139.  
  140.  
  141. nrSolutiiCautate = 4
  142.  
  143. def uniform_cost(gr):
  144. global nrSolutiiCautate
  145. global coordonate
  146. global nr_insecte
  147. global greutate
  148. global frunze
  149. # in coada vom avea doar noduri de tip NodParcurgere (nodurile din arborele de parcurgere)
  150. c = [Frunza(start, coordonate, nr_insecte, greutate, None)]
  151. continua = True # variabila pe care o setez la false cand consider ca s-au afisat suficiente solutii
  152. while (len(c) > 0 and continua):
  153. # print("Coada actuala: " + str(c))
  154. # input()
  155. nodCurent = c.pop(0)
  156.  
  157. if gr.verificaScop(nodCurent):
  158. nodCurent.afisDrum()
  159. nrSolutiiCautate -= 1
  160. if nrSolutiiCautate == 0:
  161. continua = False
  162. lSuccesori = gr.genereazaSuccesori(nodCurent)
  163. for s in lSuccesori:
  164. i = 0
  165. for i in range(len(c)):
  166. if c[i].costNodCurent() >= s.costNodCurent():
  167. break
  168. c.insert(i, s)
  169.  
  170.  
  171. def write_in_file(s):
  172. file = open("output.txt", "a")
  173. file.write(s)
  174. file.write("\n")
  175.  
  176. if __name__ == "__main__":
  177. raza, greutate, start, frunze, coordonate, nr_insecte, greutati = read_from_file()
  178. gr = Graph(raza, start, greutate, frunze, coordonate, nr_insecte, greutati)
  179. uniform_cost(gr)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement