Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Вывод массива чисел "по диагоналям"  (Прочитано 2401 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Punko

  • Автор темы
  • Гость
Вывод массива чисел "по диагоналям"
« : 23 Декабря 2015, 22:40:55 »
Доброй ночи.
Решаю классическую задачу для обучения - нужно вывести массив в таком виде, размер массива задаётся:
   1   2   4   7  10
   3   5   8  11  13
   6   9  12  14  15
Я так и не смог придумать алгоритм для решения задачки.
Пришёл к выводу, что первые три диагонали (считаем от левого верхнего угла) заполняются числами 1 - 6, и последние три диагонали имеют интервал [m*n][m*n - 6], так как в правом нижнем углу всегда последнее значение массива.
как получить элемент, который стоит предидущим на диагонали тоже не сложно - строка -1, столбец +1, исключая крайние строки и столбы.
А вот с "серединой" жуть. Я пытался вывести формулу первого ряда, но получалось не универсальное значение.
Я думаю, что если будет первый ряд, то дальнейшее заполнение не составляет труда.
Если бы массив был всегда квадратный, то проблем тоже не было бы, а так как он может быть какого угодно размера, то надо учесть сдвиги.
Мне мозгов не хватает, прошу помощи. Спасибо!

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Вывод массива чисел "по диагоналям"
« Ответ #1 : 24 Декабря 2015, 11:38:14 »
Код: (python) [Выделить]
#!/usr/bin/python3
n = 5
m = 3

count = 0
l = [[0 for i in range(n)] for _ in range(m)]

for i in range(n):
    for j in range(min(i + 1, m)):
        count += 1
        l[j][i-j] = count
for j in range(1, m):
    for k in range(m - j):
        count += 1
        l[j+k][i-k] = count

print(l)
« Последнее редактирование: 24 Декабря 2015, 11:45:20 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Heider

  • Старожил
  • *
  • Сообщений: 1269
    • Просмотр профиля
Re: Вывод массива чисел "по диагоналям"
« Ответ #2 : 24 Декабря 2015, 15:46:41 »
Было свободных полдня  :) вот прога на Си:
(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 24 Декабря 2015, 15:49:22 от Heider »

Punko

  • Автор темы
  • Гость
Re: Вывод массива чисел "по диагоналям"
« Ответ #3 : 24 Декабря 2015, 16:09:04 »
Heider,

for(d=0; d <= m+n; d++) { // Количество диагоналей на единицу меньше суммы количества строк и столбцов
Вот оно! Количество диагоналей! И почему-то я всегда перебирал по строкам и столбцам, я не догадался перебирать сразу диагонали. Спасибо, теперь понятно!
И сразу вопрос -
d <= m + nЕсли так, то надо строгое неравенство
d < m + nили
d <= m + n - 1.
Правильно же?
Azure,
Не знаю синтаксиса языка вообще, но для развития попробую разобраться. Спасибо!

Оффлайн Heider

  • Старожил
  • *
  • Сообщений: 1269
    • Просмотр профиля
Re: Вывод массива чисел "по диагоналям"
« Ответ #4 : 24 Декабря 2015, 16:19:26 »
Да, Вы правы, неравенство строгое. Моя ошибка, лишняя диагональ. Но программа все равно работает правильно, потому что во внутреннем цикле условия не соблюдаются ни разу, поэтому для лишней диагонали рассчетов не ведется.

Punko

  • Автор темы
  • Гость
Re: Вывод массива чисел "по диагоналям"
« Ответ #5 : 24 Декабря 2015, 21:00:42 »
Да, действительно. Еще раз спасибо.

wpb2tk6zvx

  • Автор темы
  • Гость
Re: Вывод массива чисел "по диагоналям"
« Ответ #6 : 25 Декабря 2015, 00:06:27 »
А мне понравился код на Python от Azure.
Python есть Python.  :)

Punko

  • Автор темы
  • Гость
Re: Вывод массива чисел "по диагоналям"
« Ответ #7 : 25 Декабря 2015, 01:40:58 »
Смотрится более лаконично, да. Но я в питон не умею вообще. сохранил код, потом гляну, сейчас слишком большой объём информации свалился =)

 

Страница сгенерирована за 0.105 секунд. Запросов: 25.