Как генерировать числа со странным рисунком в C ++

0

Мне было интересно, есть ли эффективный способ создания набора из этих 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++

Теги:
logic

1 ответ

1

Трюк состоит в том, чтобы перебирать массив по строке и столбцу:

 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)

Этого достаточно?

  • 0
    Спасибо. Этого достаточно. Я позабочусь с этого момента.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню