РЕДАКТИРОВАТЬ : я сделал упрощенное предположение, что вы хотите перейти только к соседним ячейкам. В этом случае вы смотрите только на горизонтальные, вертикальные или диагональные (45 градусов) пути. Тем не менее, когда сетка становится больше, можно рассматривать прямые пути через центры ячеек, которые пропускают соседние ячейки. Например, 10 и 19 l ie между 1 и 28 на сетке размера 7 - пример, предоставленный MBo в его комментарии. Чтобы справиться с этими случаями, вам нужно будет включить Величайший общий делитель в определение размера шага, как указано MBo в его ответе .
. Просто вычислите строку и разница столбцов в позициях и шаге от первой ячейки ко второй.
Вот пример Java кода для иллюстрации:
static int[] gridCells(int size, int from, int to)
{
int fromRow = (from-1) / size;
int fromCol = (from-1) % size;
int toRow = (to-1) / size;
int toCol = (to-1) % size;
int rowDiff = toRow - fromRow;
int colDiff = toCol - fromCol;
if(rowDiff == 0 || colDiff == 0 || Math.abs(rowDiff) == Math.abs(colDiff))
{
int maxStep = Math.max(Math.abs(rowDiff), Math.abs(colDiff));
if(maxStep > 1)
{
int rowStep = rowDiff / maxStep;
int colStep = colDiff / maxStep;
int[] cells = new int[maxStep-1];
for(int i=0; i<cells.length; i++)
cells[i] = (fromRow + (i+1)*rowStep) * size + fromCol + ((i+1)*colStep) + 1;
return cells;
}
}
return new int[]{};
}
Тест:
for(int[] t : new int[][] {{5,5}, {6,16}, {3,15}, {9,2}, {4,13}, {8,10}, {12,9}})
System.out.format("%s : %s%n", Arrays.toString(t), Arrays.toString(gridCells(4, t[0], t[1])));
Вывод:
[5, 5] : []
[6, 16] : [11]
[3, 15] : [7, 11]
[9, 2] : []
[4, 13] : [7, 10]
[8, 10] : []
[12, 9] : [11, 10]