Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import math
- import time
- def rysujGraf(x: int, y: int, graf):
- #top bar
- foo = '/'
- for i in range(0,x-1):
- foo = foo + '----'
- print(foo+'---\\')
- # rows
- for iy in range(0,y):
- foo = '|'
- for ix in range(0,x):
- value = graf[iy][ix]
- value3digit = ''
- if value < 10:
- value3digit = ' ' + str(value)
- elif value < 100:
- value3digit = ' ' + str(value)
- else:
- value3digit = '' + str(value)
- foo = foo + value3digit + '|'
- print(foo)
- if iy != y-1:
- foo = '|'
- for i in range(0, x - 1):
- foo = foo + '----'
- print(foo + '---|')
- #bottom bar
- foo = '\\'
- for i in range(0, x-1):
- foo = foo + '----'
- print(foo + '---/')
- def czyIstniejąNieodwiedzone(x: int, y: int, odwiedzone):
- for iy in range(0, y):
- for ix in range(0, x):
- if odwiedzone[iy][ix] == False:
- return True
- return False
- if __name__ == '__main__':
- # wczytaj wymiary grafu
- x = int(input())
- y = int(input())
- # utwórz graf o podanych wymiarach, inicjalizując odległości 999
- graf = [[999 for ix in range(x)] for iy in range(y)]
- # ustaw odległość w startowym narożniku na 0
- graf[0][0] = 0
- # rysuj graf
- rysujGraf(x,y,graf)
- # utwórz tablicę przejść między komórkami grafu
- tab = [[[0,0,0,0] for ix in range(x)] for iy in range(y)]
- # wczytaj wagi przejść (0 - brak przejścia)
- for iy in range(0,y):
- for ix in range(0,x):
- for id in range(4):
- tab[iy][ix][id] = int(input())
- print(tab)
- # Dijkstra
- # inicjalizacja
- odwiedzone = [[False for ix in range(x)] for iy in range(y)]
- aktualnyX = 0
- aktualnyY = 0
- # dopóki istnieją nieodwiedzone węzły powtarzamy:
- while czyIstniejąNieodwiedzone(x, y, odwiedzone):
- # ustaw nieodwiedzony węzeł z najniższą wartością jako aktualny
- najnizsza = math.inf
- for iy in range(0, y):
- for ix in range(0, x):
- if (odwiedzone[iy][ix] == False) and (graf[iy][ix] < najnizsza):
- aktualnyX = ix
- aktualnyY = iy
- najnizsza = graf[iy][ix]
- # aktualizacja sąsiadów
- for d in range(0,4):
- r = tab[aktualnyY][aktualnyX][d]
- if r > 0:
- dystansNowy = graf[aktualnyY][aktualnyX] + r
- if d == 0:
- # do góry
- dystansStary = graf[aktualnyY-1][aktualnyX]
- if dystansNowy < dystansStary:
- graf[aktualnyY-1][aktualnyX] = dystansNowy
- if d == 1:
- # w prawo
- dystansStary = graf[aktualnyY][aktualnyX+1]
- if dystansNowy < dystansStary:
- graf[aktualnyY][aktualnyX+1] = dystansNowy
- if d == 2:
- # w dół
- dystansStary = graf[aktualnyY+1][aktualnyX]
- if dystansNowy < dystansStary:
- graf[aktualnyY+1][aktualnyX] = dystansNowy
- if d == 3:
- # w lewo
- dystansStary = graf[aktualnyY][aktualnyX-1]
- if dystansNowy < dystansStary:
- graf[aktualnyY][aktualnyX-1] = dystansNowy
- # zaznaczenie aktualnego węzła jako odwiedzonego
- odwiedzone[aktualnyY][aktualnyX] = True
- rysujGraf(x, y, graf)
- time.sleep(1)
Advertisement
Add Comment
Please, Sign In to add comment