2013-11-07 3 views
0

У меня есть сетка 36х25 узлов, которую я хочу искать по всем треугольным номерам из угла, противоположного гипотенузе. Вот psuedocode для того, что я рассматривал, но этот метод работает только до тех пор, пока он не попадет в следующий угол сетки, и я уверен, что есть намного более простой способ сделать это рекурсивно, мне просто трудно понять это.Поиск сетки рекурсивно по треугольным номерам

for(int iteration; iteration < maxDistance(49); iteration++) 
{ 
    int xAdd = iteration; 
    int yAdd = 0; 
    while(xAdd != 0) 
    { 
     checkStuff(nodeGrid[x+xAdd][y+yAdd]); 
     xAdd--; 
     yAdd++; 
    } 
} 

То, что я хочу программу, чтобы сделать:

[0][1][2][3][4][5] 
[1][2][3][4][5][6] 
[2][3][4][5][6][7] 
[3][4][5][6][7][8] 
[4][5][6][7][8][9] 

проверка в этом порядке. Поэтому сначала проверьте все плитки со значением 0, затем 1 и так далее.

Примечание: в этом случае моя функция будет работать только до четвертой настройки плитки. Дальше, и он выйдет за пределы.

+0

Это не треугольные числа, треугольное число начинается с: '1,3,6,10, ...' Это числа, которые имеют форму 'n * (n + 1)/2'. Кроме того, вы уверены, что хотите сделать это рекурсивно? – Justin

+0

он будет представлять собой форму треугольного номера, если вместо этого источник был одним из других углов. Не знаю, какой термин для моей числовой формы. И поскольку моя сетка не является идеальным квадратом, я решил, что рекурсия будет самым простым решением проблемы. Если вы знаете лучший способ сделать это в цикле, не добавляя слишком много условностей, я бы тоже хотел услышать ваше решение. – SpiderShlong

ответ

0
/** 
* Only works for rectangular arrays 
*/ 
public void iterateOver(Node[][] a){ 
    int x_dim = a[0].length; 
    int y_dim = a.length; 

    for (int i = 0; i < x_dim + y_dim - 1; i++){ 
     int x, y; 
     if (i < x_dim){ 
      x = i; 
      y = 0; 
     } 
     else{ 
      x = x_dim - 1; 
      y = i - x_dim + 1; 
     } 
     for (;x >=0 && y < y_dim; y++, x--){ 
      doStuff(a[y][x]); 
     } 

    } 
} 

Как это работает

Picture ваш прямоугольный массив:

[0][1][2][3][4][5] 
[1][2][3][4][5][6] 
[2][3][4][5][6][7] 
[3][4][5][6][7][8] 
[4][5][6][7][8][9] 

Есть четко 6 столбцов и 5 строк (или 6 х значений и 5 значений у). Это означает, что нам нужно выполнить итерации 6 + 5 - 1, или 10. Таким образом, for (int i = 0; i < x_dim + y_dim - 1; i++). (i - текущая итерация, измеренная от 0). Мы начинаем с столбцов. Когда i меньше, чем размер x, x = i и y = 0 для начала. x уменьшается, а y увеличивается до x меньше нуля или y равен размерности y. Затем мы делаем аналогичную вещь с правой стороны.