Обновить

Генерация лабиринтов с использованием алгоритма Recursive backtracker

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели10K
Всего голосов 6: ↑6 и ↓0+7
Комментарии1

Комментарии 1

Было бы неплохо увидеть визуализацию каждого из шагов, т.к. не смотря на заверения автора об интуитивно понятности оно очень неинтуитивно шаффлит порядок нод в графе.

Ну, и код местами оставляет желать лучшего. check можно улучшить посчитатав все потенциальные точки сразу и просто пробежаться по ним циклом с проверкой.

def check(i,j, a,b):
  def is_in_bound(x,y): 
    return x >= 0 and y >=0
  def is_used(x,y): 
    return self.used[x][y] == 1
  
  neighbours = [
    (i-1, j-1), (i-1, j), (i-1, j+1),
    (i  , j-1),           (i  , j+1),
    (i+1, j-1), (i+1, j), (i+1, j+1),
  ]
  count = 0
  for (x,y) in neighbours:
    if is_used(x,y) and is_in_bound(x,y):
      count += 1
  if i == a: ... # остальные проверки
  return count <= 1

есть шанс что я попутал x и y местами, но код все равно для демонстрации. второй набор проверок a и b по идее тоже можно в цикле сразу проверить.

Проверка границ по идее должна учитывать ширину и высоту графа, то бишь i+1 и j+1 оказаывались меньше m и n, но почему-то не делает этого, поэтому в моём примере также проверяется только нижняя граница.

Оно несколько похоже на origin shift, но тот хоть и детерминированный, но предлагает гонять алгоритм примерно 10*m*n чтобы получать нормальный лабиринт.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации