Все возможные ходы в сетке 5х5? - PullRequest
4 голосов
/ 07 февраля 2012
s o o o o
o o o o o
o o o o o
o o o o o
o o o o e

Как я могу рассчитать все возможные пути, не используя дважды один и тот же квадрат, который человек может пройти, чтобы получить от s до e?

Я создал сетку [[1,1] ... [5,5]], но я не знаю, сработает ли это.

Я также нанес на карту возможные квадраты, и попытался создать запись и проверить и много мусора.

Любая стандартная формула, которую я мог бы использовать здесь?

Ответы [ 5 ]

5 голосов
/ 07 февраля 2012

Существует довольно много стандартных алгоритмов поиска путей, которые вы можете использовать для этого.

Это не относится к javascript.

Вы можете использовать один алгоритм без эвристики, и вам не следует останавливатьсяпо первому решению.

Вот как вы можете это сделать:

Хитрость в том, что вам нужно сохранить уже посещенные квадраты в списке и проверить, не посещаете ли вы один из них.на каждом шагу.

Другой трюк в том, что вам нужен определенный порядок между соседними квадратами.(Как сверху / справа / снизу / слева. Это действительно глупый алгоритм, но он подходит для этого конкретного случая.)

Также вам нужно иметь возможность идентифицировать квадраты (это возможно по их положению)

Рассмотрим рекурсивную функцию (например, назовите ее Visit):

function visit(square) {

    add the square to the pathlist //pathlist is not a list of paths but a list of squares which is the current path

    if (square is the goal) {
        add a copy of the pathlist to the goalslist
    }
    else {
        for (each adjacency in square.adjacencies) { // this can be calculated by adding +1 and -1 to the coordinates, and checking if its overflowing (less then one/more than five)
            if (adjacency is in pathlist) {
                //do nothing we have already been here
            }
            else {
                visit(adjacency)
            }
        }
    }

    remove square from the pathlist!!
}

Запустите этот алгоритм при посещении (начало).Вы получите свой результат в goallist, который, как мы надеемся, представляет собой список путей.

Кроме того, это всего лишь половина псевдокода javascript-half, но из него легко написать javascript.

РЕДАКТИРОВАТЬ: Наслаждайтесь решением:

<script type="text/javascript">
var start = [1,1],
    goal = [5,5],
    pathList = [],
    solutionList = [],
    solutionCount = 0,
    width = 5,
    height = 5;


function squareInArray(square, array) {
    var i = 0,
        x = square[0], 
        y = square[1];

    for (i = 0; i < array.length; i++) {
        if (x == array[i][0] && y == array[i][1]) {
            return true;
        }
    }
    return false;
}


function visit(square) {
    var i = 0,
        x = square[0], 
        y = square[1],
        adjacencies = [[x-1,y],[x+1,y],[x,y+1],[x,y-1]];

    pathList.push(square);

    if (x == goal[0] && y == goal[1]) {
        var solution = pathList.slice(0); //copy trick
        solutionList.push(solution);
        solutionCount++;
        //alert(solution);
    }
    else {
        for (i = 0; i < adjacencies.length; i++) {
            if (adjacencies[i][0] < 1 || adjacencies[i][0] > width || adjacencies[i][1] < 1 ||adjacencies[i][1] > height) {
                //overflow
            }
            else {
                if (squareInArray(adjacencies[i], pathList)) {
                    //do nothing we have already been here
                }
                else {
                    visit(adjacencies[i]);
                }
            }
        }
    }

    pathList.pop();
}

visit(start);

alert(solutionCount);
</script>

8512 голов.Также кто-то должен проверить, правильный ли мой код.

Проверьте эту скрипку: http://jsfiddle.net/SoonDead/rd2GN/3/

1 голос
/ 25 февраля 2019

если вы работаете в сетке 5x5, есть простое математическое решение.Напишите 1 в нижней и верхней части сетки и добавляйте углы, пока не дойдете до конца, число в углу в конце - это количество путей.Это предполагает, что вы можете двигаться только вправо и вниз.

Вот пример:

1 1 1 1 1 1 1 1 1 1 1 ooooo 1 2 3 4 5 6 1 ooooo -- 1 3 6 10 15 21 1 ооооо --- 1 4 10 20 35 56 1 ооооо 1 5 15 35 70 126 1 ооооо 1 6 21 56 126 252

Таким образом, ответ 252

Вы также можете использовать факториалы по формуле (количество сеток справа и снизу)!делится на (левая сторона)!делится на (вниз)! = количество путей.

Таким образом, ваше уравнение будет выглядеть как 10!делится на 5!делится на 5! = 252

Помните, что это работает, только если парень может идти только вниз и влево!

1 голос
/ 07 февраля 2012

Ссылки и библиография по этой проблеме, а также рекуррентное отношение см. В Самостоятельная прогулка в Weisstein's MathWorld . К сожалению, я не смог достать статью Эбботта и Хансона, в которой обсуждалась эта проблема.

Скорость роста последовательности по размеру квадрата огромна. Согласно OEIS A007764 , число самостоятельных прогулок в квадрате 12 × 12 составляет 182413291514248049241470885236, 30-значное число!

Спасибо за вопрос, это действительно глубокая и заставляющая задуматься проблема.

РЕДАКТИРОВАТЬ: Если разрешены диагональные шаги, число растет еще быстрее. Это последовательность OEIS A140518 , принадлежащая Д. Кнуту. Трудно перебором даже для квадрата 5 × 5 (более 400 миллионов дорожек). Есть заметки из лекции Кнута о методике под названием ZDD, которую он использовал для вычисления этих чисел.

1 голос
/ 07 февраля 2012

Вы можете использовать поиск в глубину с возвратом, чтобы найти все возможные пути. Идея состоит в том, чтобы просто начать с S и посетить любого соседа S, а затем от этого соседа все время посещать любого другого соседа, помечая эту вершину как «использованную», как только вы вернули назад, удалив «используемый» статус из вершины, чтобы вы могли использовать его в другой путь и т. д. .... как только вы достигнете E, вы увеличиваете количество путей. Пути должны быть ограничены, поэтому я предполагаю, что вы имеете в виду пути, которые не используют одну вершину более одного раза, или вы можете иметь бесконечные циклы.

Фрэнк упомянул каталонские числа, и это работает, но только для монотонных путей, то есть путей, которые идут либо вправо / вниз, либо влево / вверх. Также DP не работает, потому что это проблема NP-Hard (неполиномиальное время, чтобы найти решение и проверить, так как по сути вам нужно снова найти все пути, чтобы убедиться, что они совпадают).

0 голосов
/ 28 апреля 2013

2 в силу того, насколько велик ваш квадрат.в вашем случае 2 для степени 5 равно 32. Для этого существует тридцать два возможных маршрута.Этот шаблон может быть доказан на следующем примере.Квадрат, который равен 0x0, хотя и невозможен, технически мог бы иметь один возможный способ добраться от A до B, потому что он уже был бы там.У квадрата 1x1 есть два возможных маршрута (если вы мне не верите, нарисуйте его и выясните. Этот паттерн очень очевиден и даже связан с треугольником PAscal. Надеюсь, я помог.

...