Необходимо пересечь матричный граф в расширяющихся концентрических квадратах - PullRequest
2 голосов
/ 05 марта 2010

Хорошо, у меня есть структура данных, которая состоит из матрицы связанных узлов, скажем, 10x10.Я хотел бы иметь возможность выбрать любой из этих узлов произвольно, и - оттуда - обработать ряд окружающих узлов, следуя схеме расширения концентрических квадратов (я использовал меньше узлов ниже для целей иллюстрации).Что касается специфики, то реализация будет в Actionscript - но не стесняйтесь отвечать на другом языке :) - и это для игры тральщика (в частности, функция, при которой, если щелкнуть патч без минных квадратов, они - все- очищаться независимо от неправильной формы, вплоть до окружающих мин).Это также будет основано на событиях - отправка по одному для каждого пройденного узла, так что я представляю, что когда итератор или что-то еще сталкивается с полем, содержащим шахту, обход прекращает идти дальше в этом направлении, в то время как остальные продолжаются.Узлы вдвойне связаны с их верхним, правым, нижним и левым соседями, и я не буду против добавления дополнительных ссылок в случае необходимости.Возможно, есть какой-то другой способ сделать это, но я могу придумать несколько вариантов использования такого решения и хотел бы включить его в создаваемую мной среду, поэтому я бы хотел уйти с чем-то, что я могу использовать повторно.

первый:
0 0 0 0 0
0 0 0 0 0
0 0 X 0 0
0 0 0 0 0
0 0 0 0 0

секунда:
0 0 0 0 0
0 XXX 0
0 X 0 X 0
0 XXX 0
0 0 0 0 0

третий:
XXXXX
X 0 0 0 X
X 0 0 0 X
X 0 0 0 X
XXXXX

1 Ответ

0 голосов
/ 05 марта 2010
function scan( x, y ){
    queue toDo;
    set queued;

    toDo.push( x, y );
    queued.add( x, y );
    while ( !toDo.empty() ) {
        (x, y) = toDo.removeHead();

        if ( process( x, y ) != stop ) {
            for( xp = -1; xp <= 1; ++xp ) {
                for( yp = -1; yp <= 1; ++yp ) {
                    if ( !queued.contains( x+xp, y+yp ) ) {
                        toDo.push( x+xp, y+yp );
                        queued.add( x+xp, y+yp );
                    }
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...