Что является правильным для кода цикла, который пересекает соседей матричного элемента и проверяет границы? - PullRequest
0 голосов
/ 02 июня 2019

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

Мне даны индексы строк и столбцов, r и c двумерной матрицы.Я хочу быть в состоянии пройти 4 соседей.Если элемент находится в углу, он будет иметь только 2 соседей.Если элемент находится на границе, но не в углу, он будет иметь 3 соседей.Если он внутри, у него будет 4 соседа.

Так что я хочу пройти (r+1,c), (r-1,c), (r,c+1), (r,c-1) и выполнить проверку границ r >= 0 && r < num_rows и c >= 0 && c < num_cols одновременно вдвойное гнездо для цикла.

Единственное, что мне удалось придумать, это:

vector<vector<int>> adds{{0,1},{1,0},{-1,0},{0,-1}}

for(int i = 0; i < adds.size(); i++)
{
  //do bounds checking with r + adds[i][0] and c + adds[i][1]
  //do something with matrix[r + adds[i][0]][c + adds[i][1]]

}

Особенно элегантный, который я помню, видел что-то с функцией max и неиспользуйте массив adds, который у меня есть.

1 Ответ

0 голосов
/ 03 июня 2019

Комплексные числа!: D

Complex i = {0, 1};

int neighbours[4];
// Multiplying by i to rotate 90 degrees
for (int i = 0, Complex offset = {1,0}; i < 4; ++i, offset *= i) {
  if (x + offset.re >= width or x + offset.re < 0 or y + offset.im >= length) 
    neighbours[i] = nullptr; // Some known invalid value
  else
    neighbours[i] = arr[x + offset.re][y + offset.im];
}

Вот одна из моих реализаций .

Классная вещь: если вы измените угол, который множитель представляет ({cos(phi), sin(phi)}), вы могли быдостаньте ячейки матрицы, скажем, шестиугольник вокруг нее!Вы даже можете изменить расстояние, которое они находятся от главной ячейки, или вращение всей вещи.

изображение, которое я пока не могу опубликовать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...