Menu
CoddyTech

Типичные шаблоны работы с двумерными массивами

Часть раздела Логика и потоки выполнения путешествия по GDScript на Coddy. Урок 17 из 78.

Некоторые способы обхода сетки встречаются снова и снова. В этих примерах используется квадратная сетка размером n:

var grid := [
	[1, 2, 3],
	[4, 5, 6],
	[7, 8, 9]
]
var n := grid.size()

Диагонали. На главной диагонали индекс строки равен индексу столбца: grid[i][i]. На побочной диагонали, от верхнего правого угла к нижнему левому, индекс столбца равен n - 1 - i. Достаточно одного цикла:

for i in range(n):
	print(grid[i][i], " ", grid[i][n - 1 - i])
1 3
5 5
9 7

Строки, столбцы и границы. Зафиксируй один индекс и перебирай другой. Верхняя строка — это grid[0], а нижняя строка — grid[n - 1]. В столбце c остаётся фиксированным, а строка меняется:

var left_total := 0
for r in range(n):
	left_total += grid[r][0] # левый столбец: 1 + 4 + 7
print(left_total) # 12

Соседи. В играх на сетке часто нужно смотреть на клетки вокруг позиции: сверху, снизу, слева и справа. Сохрани четыре шага в виде массива пар [row, column] и пропускай шаги, ведущие за пределы сетки:

var r := 0
var c := 1
for step in [[-1, 0], [1, 0], [0, -1], [0, 1]]:
	var nr: int = r + step[0]
	var nc: int = c + step[1]
	if nr >= 0 and nr < n and nc >= 0 and nc < n:
		print(grid[nr][nc])

Ячейка grid[0][1] находится на верхней границе, поэтому у неё 3 соседа: 5, 1 и 3.

challenge icon

Задание

Легко

Напиши функцию с именем print_patterns с одним параметром grid: квадратный двумерный массив целых чисел (объяви его как grid: Array). Она выводит шесть строк, в которых значения разделены одиночными пробелами:

  1. Main diagonal: и ячейки, у которых индекс строки равен индексу столбца
  2. Anti-diagonal: и ячейки от верхнего правого до нижнего левого угла
  3. Top row: и первая строка
  4. Bottom row: и последняя строка
  5. Left column: и первый столбец, сверху вниз
  6. Right column: и последний столбец, сверху вниз

Для сетки [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]] вывод будет таким:

Main diagonal: 1 6 11 16
Anti-diagonal: 4 7 10 13
Top row: 1 2 3 4
Bottom row: 13 14 15 16
Left column: 1 5 9 13
Right column: 4 8 12 16

Тесты вызывают print_patterns() самостоятельно. Не вызывай её и ничего не возвращай.

Попробуйте сами

func print_patterns(grid: Array):
	# Напишите код здесь
	pass
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и потоки выполнения

Потренируйтесь самостоятельно: Онлайн-компилятор GDScript