Функция валидации для не пересекающих границ матрицы (лабиринта)


Предположим, что вы запрограммировали матрицу m x n в Python. Невозможно иметь значение вне матрицы. Предположим, что вы являетесь чем-то, что движется в матрице (как в лабиринте), и что вы не можете пересечь границы. В то время как вы двигаетесь по лабиринту, вы постоянно рассматриваете свои варианты, в какую сторону вы можете пойти. Поэтому для каждого шага вам нужно проверить, можете ли вы идти в любом направлении или есть границы, которые вы не можете пересечь.

Итак, рассмотрим функцию, которая должна проверьте, возможен ли ввод для следующего шага. Если входным сигналом является позиция в матрице (x,y), то он должен проверить, может ли он двигаться в любом направлении, не пересекая границ матрицы. Поэтому ему нужно проверить, находятся ли позиции (x+1,y),(x-1,y),(x,y-1),(x,y+1) все еще в матрице.

Вы можете сделать эту функцию с большим количеством if-операторов, таких как
if x-1 < 0: return False

elif y+1 > len(matrix): return False

Вы можете сделать эти if-утверждения для каждого направления, но мне кажется, что это большая работа для простой проверки вход. Может быть, есть встроенная функция или свойство матрицы или гораздо более простой оператор if, чтобы вы могли легче проверить входные данные?

1 3

1 ответ:

Это немного зависит от того, какой язык вы используете, но чаще всего я пишу код для проверки соседних позиций, как это (если мы не считаем диагонали смежными):

//given current position in x and y...

int dx=1, dy=0; //first check to the right
for (int i=0; i<4; i++)
{
    int testx = dx, testy = dy; //remember current direction
    dx = -testy; dy = testx;    //next direction is rotated 90 degrees
    testx += x; testy += y;     //new position to test
    if (testx>=0 && testx<width && testy>=0 && testy<height)
    {
        //this position is within the matrix.  do other checks and stuff
    }
}

Если вы тоже хотите проверить диагонали, то я часто делаю что-то вроде этого:

//given current position in x and y...

for (int dy=-1; dy<=1; ++dy)
{
    for(int dx=-1; dx<=1; dx+=(dy==0?2:1))
    {
        int testx = x+dx, testy = y+dy; //new position to test
        if (testx>=0 && testx<width && testy>=0 && testy<height)
        {
            //this position is within the matrix.  do other checks and stuff
        }
    }
}

Правка:

Оооо, я только что придумал новый способ сделать 4-полосный случай смежности, который я думаю, что буду использовать с этого момента (вы получаете апвот!). Этот код генерирует 4 смежных позиции по часовой стрелке:

//given current position in x and y...

for (int i=0; i<4; ++i)
{
    int dse = (i>>i)&1;
    int dsw = (i^dse)&1;
    int testx = x+dsw-dse, testy = y+1-dsw-dse; //new position to test
    if (testx>=0 && testx<width && testy>=0 && testy<height)
    {
        //this position is within the matrix.  do other checks and stuff
    }
}