Lunali
@Lunali
скрытна.

Кто знает простое построение Алгоритм Дейкстры в Скретч?Питон?

Мне нужно пояснение Алгоритм Дейкстры или упрощенный вариант в Скретч и Питон
Несмотря что этот алгоритм учат в 7 классе, не в одном учебнике информатике примеров не нашла .
На просторах интернет тоже этого нет .Мне нужен не готовый код ,а пошаговое пояснение .
Суть задачи.
6050ed04b0183608551776.jpeg
пусть у нас есть поле 3 на 4 ,на этом поле два спрайта .
Нужно что бы один спрайт повернулся в сторону другого спрайта и начал движение по кратчайшему пути строго по сетке .

Вторая задача такая же , но условие ,если есть преграда то обойти .
Я видела решение таких задач например в Движке Construct 2 довольно простое, но в Питон и Скретч это не будет работать ....
Если есть кто то кто хорошо знает скретч, можете подсказать порядок действия?
  • Вопрос задан
  • 162 просмотра
Решения вопроса 1
@Alexa2007
Пояснение
Код:
import math


def arg_min(T, S):
    amin = -1
    m = math.inf  # максимальное значение
    for i, t in enumerate(T):
        if t < m and i not in S:
            m = t
            amin = i

    return amin


D = ((0, 3, 1, 3, math.inf, math.inf),
     (3, 0, 4, math.inf, math.inf, math.inf),
     (1, 4, 0, math.inf, 7, 5),
     (3, math.inf, math.inf, 0, math.inf, 2),
     (math.inf, math.inf, 7, math.inf, 0, 4),
     (math.inf, math.inf, 5, 2, 4, 0))

N = len(D)  # число вершин в графе
T = [math.inf]*N   # последняя строка таблицы

v = 0       # стартовая вершина (нумерация с нуля)
S = {v}     # просмотренные вершины
T[v] = 0    # нулевой вес для стартовой вершины
M = [0]*N   # оптимальные связи между вершинами

while v != -1:          # цикл, пока не просмотрим все вершины
    for j, dw in enumerate(D[v]):   # перебираем все связанные вершины с вершиной v
        if j not in S:           # если вершина еще не просмотрена
            w = T[v] + dw
            if w < T[j]:
                T[j] = w
                M[j] = v        # связываем вершину j с вершиной v

    v = arg_min(T, S)            # выбираем следующий узел с наименьшим весом
    if v >= 0:                    # выбрана очередная вершина
        S.add(v)                 # добавляем новую вершину в рассмотрение

#print(T, M, sep="\n")

# формирование оптимального маршрута:
start = 0
end = 4
P = [end]
while end != start:
    end = M[P[-1]]
    P.append(end)

print(P)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы