Функция валидации для не пересекающих границ матрицы (лабиринта)
Предположим, что вы запрограммировали матрицу 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 ответ:
Это немного зависит от того, какой язык вы используете, но чаще всего я пишу код для проверки соседних позиций, как это (если мы не считаем диагонали смежными):
//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 } }