2012-05-28 5 views
-1

Скажем, у меня есть следующие сетки:Как перемещаться по сетке

Grid Outline 0,0 .. 3,5

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

0,5 => 0,4 => 1,5 => 1,4 => 0,3 => 2,5, => 1,3 => 2,4 => 2,3... 

Другой способ визуализировать:

(1) 0,5 => 
(2) 0,4 => (1,5) (1,4) 
(3) 0,3 => (2,5) (1,3) (2,4) (2,3) 
(4) 0,2 => (3,5) (1,2) (3,4) (2,2) (3,3) (3,2) 

Так вот это шаблон, который я вижу:

  1. Для начала каждый цикл взять предыдущее значение петли (x, y) и сделать его (x, y-1)
  2. Итак, появляется шаблон, который выглядит как: (+1, y) (x, -1) (+1, y) (x, -1), и поэтому вы можете вытащить старые значения и чередовать инкремент с учетом x с уменьшением y.

Это неправильный инструмент для этой работы?

Есть ли умный алгоритм, который будет делать это, мне не нужно вытягивать предыдущее значение и просто рассчитать их? Я лаяю здесь неправильное дерево и должен ли я подойти по-другому (правильно?)?

EDIT:

Вот попытка рисования пути. Не уверен, если это имеет смысл:

enter image description here

Идея заключается старт в левом нижнем углу на первой ячейке. Поднимитесь на одну ячейку, а затем чередуйте, когда они образуют правильный угол. Как только будет сформирован полный правый угол, поднимитесь на одну ячейку и замените ее на новый правый угол.

+0

Я не понимаю, какой путь вам нужен (несмотря на ваши примеры). Не могли бы вы нарисовать путь в сетке? – aioobe

+0

Когда вы доберетесь до (3,2), как идет путь? Или сетка продолжается в x и y? Это бесконечно? – Helen

+0

@ Показать сетку не бесконечно. Можно предположить, что имеется менее 20 столбцов и строк. Однако они могут быть не квадратными. –

ответ

1

Возможное решение, отредактированы, не квадратной сетки:

for(startY = maxY, startY >= 0; startY++) 
{ 
    x1 = 0; 
    y1 = startY; 
    x2 = 5 - startY; 
    y2 = 5; 

    while(!(x1 == x2 && y1 == y2)) 
    { 
     if(x1 <= maxX) 
      //Point 1 is x1, y1 

     if(y2 >= 0) 
      //Point 2 is x2, y2 

     x1++; 
     y2--; 
    } 

    if(x1 <= maxX) 
     //Final point is x1, y1 
} 

Таким образом, вы вычислить две точки на каждой итерации цикла в то время как и последней диагональной точки для каждой итерации через цикл после остальных точек для этой части пути.

Смежные вопросы