예제 #1
0
 public Handler(int size, Coords start, Coords end) : this(size, size, start, end)
 {
 }
예제 #2
0
        // Делаем базовые проверки и ищем путь
        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);
        }
예제 #3
0
 public Handler(Coords start, Coords end) : this(8, start, end)
 {
 }