Нужно обойти поле, дан такой паттерн (если я правильно применил это слово):
- вправо на 1
вниз и влево на 1
вправо на 1
- Код: Выделить всё
0 1
2 3
На поле 4*4 берём за единицу поле 2*2 и обходим по тому же паттерну, каждое поле 2*2 обходим, как указано выше:
- Код: Выделить всё
0 1 4 5
2 3 6 7
8 9 12 13
10 11 14 15
Соответственно на поле 8*8 единицей уже будет поле 4*4, смысл, надеюсь, понятен.
Я нашёл простую битовую формулу, которая по координатам клетки сразу вычисляет её порядок прохождения, вот весь проект:
- Код: Выделить всё
Option Explicit
Dim Ar(15, 15) As Long
Private Sub Form_Load()
Dim x As Long, y As Long
ScaleMode = vbPixels
Move Left, Top, Width - Screen.TwipsPerPixelX * (ScaleWidth - 512), Height - Screen.TwipsPerPixelY * (ScaleHeight - 512)
Fill
For y = 0 To 15
For x = 0 To 15
CurrentY = y * 32 + 8
CurrentX = x * 32 + 6
Print Format(Ar(x, y), "00#");
Next x
Next y
End Sub
Private Sub Fill()
Dim x As Long, y As Long
For y = 0 To 15
For x = 0 To 15
Ar(x, y) = Calc(x, y)
Next x
Next y
End Sub
Private Function Calc(ByVal x As Long, ByVal y As Long) As Long
Dim d As Long, v As Long
d = 1
While d <= 64
If x And d Then v = v Or d
d = d + d
x = x + x
y = y + y
If y And d Then v = v Or d
d = d + d
Wend
Calc = v
End Function
Но мне нужно именно ОБОЙТИ клетки в соответствующем порядке, это явно рекурсия, и чую всеми местами, что она должна быть простой, но что-то у меня пока выходит что-то монструозное, жду свежие мысли от вас.
Вариант с обходом по заранее подготовленному\вычисленному массиву индексов не предлагать, это и так понятно.