Я новичок в C ++, есть ли алгоритм, чтобы найти расстояние до ближайшего 0 в 3D-массив? - PullRequest
0 голосов
/ 05 октября 2019

В трехмерном массиве диагональные элементы равны 0, то есть a [k] [k] [k] = 0 для k = 1–10. Мне нужно заполнить оставшуюся матрицу расстоянием до ближайшего 0.

Я наткнулся на поиск в ширину, но могу ли я сделать это без использования структур данных? (не знаком со структурами данных)

unsigned short d = 10, r = 10, c = 10;
  double*** a = new double** [d];
  for (int i = 0; i < d; ++i) {
      a[i] = new double* [r];
      for (int j = 0; j < r; ++j)
          a[i][j] = new double[c];
  }
  for (int i = 0; i < 10; i++) {
      a[i][i][i] = 0;
  }

возвращает массив расстояний 3d.

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

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

0 голосов
/ 08 октября 2019

Просто заполните вашу матрицу этой формулой для всех i, j, k:

a[i][j][k] = MAX(i,j,k) - MIN(i,j,k)

Манхэттенское расстояние до диагонали - это действительно разница между самым высоким и самым низким индексами.

Эта формула настолько проста, что кажется несколько волшебной, но она работает!

...