Как вывести определенное значение в центр массива при его разной размерности?

Всем привет. Столкнулся с небольшой проблемой при решении задачи.
605730f757231044185809.jpeg
Необходимо, в точности как на изображении, создать прямоугольник из символов '#' и центр этого прямоугольника заполнить пустыми символами. Проблема нарастает тогда, когда размерность массива растет. В задаче требуется, чтобы его размерность могла быть от 3 до 100.
  • Вопрос задан
  • 149 просмотров
Решения вопроса 2
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Edit:

Раз задача построить концентрические вложенные квадраты, то есть 2 подхода.

Простой для понимания, но менее эффективный (но все-равно отлично быстрый для смешных ограничений в задаче) - напишите функцию, которая в двумерном массиве рисует квадрат заданного размера вокруг центра. Это тупо 4 последовательных, не вложенных цикла. Каждый рисует одну сторону квадрата. Тупо цикл до n, где n - длина стороны квадрата. Там одна координата фиксирована, а другая пробегает вдоль стороны. Надо чуть-чуть подумать, и составить формулы, какие строки и столбцы будут закрашены.

Заведите двумерный массив, заполните его пробелами, и потом циклом от n%2 до n с шагом 2 рисуйте квадраты.

Второй, более эффективный, подход - это немного подумать. Возьмите клетчатый лист, или в редакторе каком-либо нарисуйте ответ для n=9,10. Подумайте над паттернами. Первая строка будет всегда из n #. Вторая будет #, n-2 " ", #. Следующая "# #...# #" и так далее.

Одни строки будут иметь в середине отрезок из "#" какой-то длины, а по краям заданное количество чередующихся "#" и " ". Соседние строки будут содержать в середине отрезок из пробелов, а вокруг чередующиеся решетки и пробелы. По номеру строки можно весьма просто вычислить длины среднего отрезка и чередующихся кусков. Соответственно можно вывести ответ сразу же не формируя его в массиве. Выводите чередующиеся "# " нужное количество раз. Потом выводите "#" или " " нужное количество раз. Потом выводите " #" нужное количество раз. Это один внешний цикл, несколько тупых формул, три вложенных последовательных цикла с выводом.

Подсказка для формулы - имеет значение, как близко строка к середине массива и четность n. Расстояние до середины можно получить как abs(n/2 - i)
Ответ написан
longclaps
@longclaps
Хрен знает, завезли ли вам слайсы, а у нас в питоне они всегда были:
def f(n):
    l = [' '] * (n * (n + 1) - 1)
    l[n::n + 1] = '\n' * (n - 1)
    l[:n] = l[-n:] = l[::n + 1] = l[n - 1::n + 1] = '#' * n
    print(''.join(l))

f(5)

ps а пятнышко в середине последнего квадрата не нужно?
pps слайсы - те же циклы

UPDATE концентрические квадраты
def f(n):
    l = [[' '] * n for _ in range(n)]  # двумерный массив
    for shift in range(0, n // 2 + 1, 2):
        # рисуем как умеем верхние стороны квадратов
        l[shift][shift:n - shift] = '#' * (n - shift * 2)
    for i, row in enumerate(l):
        for j, ch in enumerate(row):
            if ch == '#':
                # заполняем симметричные точки
                l[j][i] = l[j][n - i - 1] = l[n - i - 1][n - j - 1] = '#'
    for row in l:
        print(''.join(row))

f(17)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы