Помощь - Поиск - Пользователи - Календарь
Полная версия: Диагонали матрицы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Unconnected
Привет всем.

Вопрос, как можно пройти по абсолютно всем диагоналям матрицы? Ну для двух главных диагоналей я сам написал, для остальных, как мне подсказали, нужны циклы for, обращаться к элементам матрицы надо по индексам i+j,j и j,j+i, но вот что-то меня вторая пара параметров смущает... И кажется, они не все диагонали проходят..

Ps: в поиск заглядывал, работу с матрицами смотрел, диагоналей не нашёл.
Lapp
Цитата(Unconnected @ 11.12.2009 22:58) *
как можно пройти по абсолютно всем диагоналям матрицы
Чтот это значит? Выразись точнее, плз. Иначе, боюсь, что вот такой ответ будет верным:
for i:=1 to n do for j:=1 to m do

- проходит по всем диагоналям без проблем.
Тебе важен порядок? Тогда высаажись точнее, чего именно ты хочешь.
andriano
Вообще-то у квадрата только две диагонали. И у квадратной матрицы - тоже.
Что ты называешь диагоналями кроме этих двух?
Ozzя
Цитата
И у квадратной матрицы - тоже

Безусловно согласен.
Массивы. Матрицы. Типичные задачи.
Unconnected
Цитата
- проходит по всем диагоналям без проблем.
Тебе важен порядок? Тогда высаажись точнее, чего именно ты хочешь.


Получается, что важен порядок.
Цитата

Вообще-то у квадрата только две диагонали. И у квадратной матрицы - тоже.
Что ты называешь диагоналями кроме этих двух?


Я не силён в терминологии, приложил рисунок, на нём якобы квадратная матрица, красными линиями я обозначил то, что назвал главными диагоналями, синими - все остальные, "диагонали"... И мне нужно пройти по каждой синей, именно последовательно, сначала по одной, потом по следующей...

andriano
for j := 0 to N-1 do // перебор по "диагоналям"
for i := 0 to N-1-j do // идем вдоль "диагонали"
a[j+i,i]...
Это по одному семейству и аналогично по перпендикулярным
Unconnected
Цитата
Это по одному семейству и аналогично по перпендикулярным


А аналогично - это как? Индексы местами поменять при обращении к элементу?
andriano
Чтобы не повторять "настоящие" диагонали, лучше их обработать отдельно, тогда кроме них:

for j := 1 to N-1 do // перебор по "диагоналям"
for i := 0 to N-1-j do begin// идем вдоль двух симметричных "диагоналей"
a[j+i,i]... // вниз от диагонали "верх-лево -- низ-право"
a[i,j+i]... // вверх от диагонали "верх-лево -- низ-право"
a[j+i,N-1-i]... // вниз от диагонали "верх-право -- низ-лево"
a[i,N-1-i+j]... // вверх от диагонали "верх-право -- низ-лево"
end;

Unconnected
Спасибо, оно, только придётся делать 4 цикла, т.к. мне по порядку именно надо:)
Unconnected
А этот код рассчитан на матрицу, индексы в которой начинаются с нуля? Просто если подразумевалась начало с единицы, то например a[j+i,i] при первой итерации будет обращаться к элементу, принадлежащему к настоящей диагонали.
andriano
Мы ведь пишем на Паскале, а не на Фортране, поэтому, если не оговорено обратное, индексы ВСЕГДА начинаются с 0.
Да и границы цикла по i однозначно на это указывают.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.