SoKnight

Untitled

Mar 15th, 2023
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.02 KB | None | 0 0
  1. #
  2. # Home work #7
  3. # Task 'Dyn6' (#1)
  4. #
  5.  
  6. # принимаем на вход константы N и L, чёрный список клеток и список кэшированных результатов
  7. def solve(_n: int, _l: int, _blacklisted: set, _cache: list) -> int:
  8.     # вычислим количество возможных входов в каждую клетку из предыдущих,
  9.     # основываясь на максимальной длине шага L (будем брать от 1 до L)
  10.  
  11.     # конкретно данная часть алгоритма проходит по всем клеткам, итерируя
  12.     # шаги от неё на все возможные величины длин (от 1 до L), то есть
  13.     # мы можем шагнуть дальше на кол-во клеток от 1 до L
  14.     # если шаг возможен - увеличиваем счётчик входов для клетки, в которую шагнули
  15.  
  16.     # идём по всем клеткам до последней (от 1, нулевая нам не нужна, мы в неё не входим)
  17.     for i in range(1, _n + 1):
  18.         # если мы в клетке с лягушкой - не вычисляем в этом случае ничего
  19.         if i in blacklisted:
  20.             continue
  21.  
  22.         # для данной клетки делаем шаги длиной от 1 до L
  23.         for j in range(i, i + _l):
  24.             # спокойно можем перепрыгнуть за нужную клетку, учитываем это
  25.             if j > _n:
  26.                 break
  27.  
  28.             # опять же можем прийти в клетку с лягушкой - нам это не надо
  29.             if j in blacklisted:
  30.                 continue
  31.  
  32.             # пришли из данной клетки в какую-то доступную - увеличиваем счётчик входов для неё
  33.             _cache[j] += 1
  34.  
  35.     # опять идём по всем клеткам и собираем кол-во входов в них
  36.     for i in range(1, _n + 1):
  37.         # хуесосим лягушек
  38.         if i in blacklisted:
  39.             continue
  40.  
  41.         # общее кол-во входов в данную клетку будет равно сумме
  42.         # входов во все те клетки, из которых мы можем сюда придти
  43.         # поэтому делаем отступ назад на кол-во шагов от 1 до L
  44.         _sum = 0
  45.         for j in range(i - _l, i):
  46.             # опять можем выйти за допустимые границы или наступить на жабу, учитываем
  47.             if j >= 0 and j not in blacklisted:
  48.                 # если все оке, то добавляем кол-во входов в клетку позади к общему кол-ву
  49.                 _sum += _cache[j]
  50.  
  51.         # записываем результат в кэш под нужным номером клетки
  52.         _cache[i] = _sum
  53.  
  54.     # просто отладочные сообщения для наглядности, можно выпилить нахуй
  55.     for i in range(1, _n + 1):
  56.         if i not in blacklisted:
  57.             print(f"Путей входа в точку #{i}:", _cache[i])
  58.  
  59.     # кол-во путей в последнюю клетку уже вычислено в кэше - просто достаём его оттуда
  60.     return _cache[_n]
  61.  
  62.  
  63. # из файла ввода нужны только первые две строки, вытащим их и закроем файл
  64. input_file = open('ex1/input.txt', 'r', encoding='UTF-8')
  65.  
  66. first_line = input_file.readline().split(' ')
  67. second_line = input_file.readline().split(' ')
  68. input_file.close()
  69.  
  70. # из первой строки вытащим константы N и L (см. по заданию)
  71. magic_number_n = int(first_line[0])
  72. magic_number_l = int(first_line[1])
  73.  
  74. # числа во второй строке - это клетки с лягушками, занесём их в "чёрный список"
  75. blacklisted = set(map(int, second_line))
  76. # создадим список для кэшированных результатов предыдущих вычислений
  77. # это и есть суть темы, правда с [0] у меня не работало, только вот с [1] всё норм
  78. cache = [1] * (magic_number_n + 1)
  79.  
  80. # вызовем функцию решения задачи и выведем результат
  81. result = solve(magic_number_n, magic_number_l, blacklisted, cache)
  82. print('Result:', result)
  83.  
  84. # также результат нужно записать в файл по условию задания, тут всё понятно
  85. output_file = open('ex1/output.txt', 'w', encoding='UTF-8')
  86. content = list()
  87. content.append(str(result))
  88. output_file.writelines(content)
  89. output_file.close()
  90.  
Add Comment
Please, Sign In to add comment