public Handler(int size, Coords start, Coords end) : this(size, size, start, end) { }
// Делаем базовые проверки и ищем путь public bool Execute(out List <Coords> path) { // Стартовая клетка - начало пути path = new List <Coords> { start }; passed[start.X, start.Y] = true; // Проверяем по цветам клеток существование пути if (!SolutionPossible()) { return(false); } // Идем до последнего шага for (step = 1; step < width * height;) { // Пробуем совершить доступный ход var move = MakeMoveFrom(path.Last()); if (move.HasValue && !BlockedExist(move.Value)) { step++; path.Add(move.Value); passed[move.Value.X, move.Value.Y] = true; lastCancelled = null; } else { // Откатываемся если не получилось if (step == 1) { // Фейл break; } // Дописываем откат switcher.CurrentReturn++; if (switcher.CurrentReturn > switcher.MaxReturn) { // Меняем сеты/увеличиваем циклы switcher.CurrentReturn = 0; switcher.SwitchSet(); // ~10000 - порог для реверсирования if (switcher.MaxReturn > 10000) { var temp = end; end = start; start = temp; // Скидываем количество циклов!! switcher.MaxReturn = 1; // Флаг реверса для корректного вывода!! reverse = true; } // Обнуляем прогресс step = 1; path = new List <Coords> { start }; CleanBoard(); passed[start.X, start.Y] = true; // Перезапускаемся continue; } step--; var last = path.Last(); passed[last.X, last.Y] = false; lastCancelled = last; path.Remove(last); } } if (reverse) { path.Reverse(); } return(step == width * height); }
public Handler(Coords start, Coords end) : this(8, start, end) { }