Мне было интересно, есть ли эффективный способ создания набора из этих 4 чисел в C++:
(0,2,1,0) ; // A
(1,2,2,0) ; // B
(2,2,3,0) ; // C
(4,1,0,3) ; // D
(4,2,5,0) ; // E
(5,1,1,3) ; // F
(5,2,6,0) ; // G
(6,1,2,3) ; // H
(6,2,7,0) ; // I
(7,1,3,3) ; // J
(8,1,4,3) ; // K
(8,2,9,0) ; // L
(9,1,5,3) ; // M
(9,2,10,0) ; // N
(10,1,6,3) ; // O
(10,2,11,0) ; // P
(11,1,7,3) ; // Q
(12,1,8,3) ; // R
(12,2,13,0) ; // S
(13,1,9,3) ; // T
(13,2,14,0) ; // U
(14,1,10,3) ; // V
(14,2,15,0) ; // W
(15,1,11,3) ; // X
(16,1,12,3) ; // Y
(16,2,17,0) ; // Z
(17,1,13,3) ; // A1
(17,2,18,0) ; // B1
(18,1,14,3) ; // C1
(18,2,19,0) ; // D1
(19,1,15,3) ; // E1
" 16 Y 12 R 8 K 4 D 0"
" Z S L E A"
" 17 A1 13 T 9 M 5 F 1"
" B1 U N G B"
" 18 C1 14 V 10 O 6 H 2"
" D1 W P I C"
" 19 E1 15 X 11 Q 7 J 3"
Рассмотрим числа на приведенном выше рисунке как квадрат и алфавиты от A до E1 как пересечение соседних квадратных ребер. В приведенном выше списке каждое множество (A, B, C..) имеет 4 числа. Числа в позициях 1 и 3 представляют собой квадратный номер. Числа в позициях 2 и 4 представляют собой тип квадратного края (верхний - 0, правый - 1, нижний - 2, левый - 3). Первый набор чисел представляет собой пересечение A. Это пересечение между квадратным числом 0 (нижний край - 2) и квадратным номером 1 (верхний край - 0), как показано на приведенной выше диаграмме. Таким образом, A равно 0,2, 1,0.
Аналогично, B - это пересечение квадратной части 1 (нижний край - 2) и квадратной части 2 (верхний край - 0). Следовательно, B является (1,2,2,0). Аналогично, C является (2,2,3,0) --intersection квадратной части 2 (нижний край - 2) и квадратной частью 3 (верхний край - 0)
Вопрос заключается в том, как сгенерировать эти числа в C++
Трюк состоит в том, чтобы перебирать массив по строке и столбцу:
4 3 2 1 0
---------------
16 12 8 4 0 | 0
17 13 9 5 1 | 1
18 14 10 6 2 | 2
19 15 11 7 3 | 3
Например, столбец 1 и строка 2 означают квадрат 6.
Чтобы итератировать по квадратам таким образом в правильном порядке, мы используем вложенные циклы следующим образом:
int num_cols = 5;
int num_rows = 4;
for(int col=0; col<num_cols ; ++col)
{
for(int row=0; row<num_rows ; ++row)
{
cout << "this is column " << col << ", row " << row << endl;
}
}
Теперь нам просто нужно выяснить, что делать в определенном месте. Каков номер площади? Вы должны легко увидеть, что это col*num_rows + row
. И число квадрата ниже (если оно есть) - col*num_rows + row + 1
, а номер строки справа (если есть) - (col-1)*num_rows + row
. Так, например, если col
равно 1, а row
- 2, ребра для отчета
(6,1,2,3)
(6,2,7,0)
Этого достаточно?