Закономерности двумерного массива
Здесь я опишу некоторые закономерности двумерного массива, которые помогут тебе (или Вам) с лёгкостью решать любую задачу по двумерному массиву, не прибегая к чьей-либо помощи. Начнём с того, что любой двумерный массив представляет собой матрицу, т.е. набор чисел, каждое из которых, так сказать, «вставлено» в конкретную ячейку, имеющую свой индивидуальный адрес. Адрес – это два индекса, которые показывают на пересечении какой строки и какого столбца находится тот или иной элемент. Теперь конкретнее. Взгляни на рисунок.
На нём изображена квадратная матрица, т.е. матрица, у которой количество элементов по длине и ширине одинаково. В последующем мы будем пользоваться именно такой из-за её удобства. Это матрица размером 10 на 10 элементов, заполненная не произвольными числами, а индексами (или адресами) элементов. Вот как раз по этим индексам у нас и происходит обращение к элементам массива. Мы можем присваивать им значения, импортировать, сравнивать, производить какие-либо действия и давать им уже новое получившееся значение. Но чтобы все эти операции производить не вручную, а с помощью компьютера, надо выявить определённую закономерность с индексами элементов. Описав последнюю нужным образом и заключив в цикл, мы получим основную часть программы для решения определённой задачи на двумерный массив. Закономерность в 100% случаев заключается в одинаковом соотношении первых и вторых индексов для всех элементов, лежащих в определённом месте, к примеру, выше главной диагонали, на побочной диагонали, сверху от пересечения диагоналей, ну и т.д.
Перейдём к конкретным примерам. Допустим, нам надо найти сумму элементов на главной диагонали. Для начала напомним, что главная диагональ идёт начиная от верхнего левого угла до нижнего правого, а побочная, соответственно, из левого нижнего в правый верхний. Ну так вот, посмотри на первый и второй индекс каждого из элементов, лежащего на главной диагонали. Что ты видишь? Они равны! Поэтому в условии ты можешь смело писать:
if i=j then s:=s+a[i,j] , где s – переменная суммы, i – первый индекс, j – второй индекс.
Ну а теперь без объяснений: просто смотри на рисунок и сверяй.
1. Индексы элементов, лежащих на главной диагонали равны (доказано ранее) т.е. i = j
2. Первый индекс всех элементов выше главной диагонали меньше второго, т.е. i < j
3. Первый индекс всех элементов ниже главной диагонали больше второго, т.е. i > j
4. Для элементов побочной диагонали сумма первого и второго индексов равна «наращенному» на единицу порядку матрицы, т.е. i + j = N+1 ,где N – порядок матрицы. Порядок матрицы – это количество элементов матрицы по вертикали или горизонтали. И элемент матрицы на побочной диагонали в общем виде будет иметь адрес a[i, N+1– i] , где a – название массива.
5. Для элементов, находящихся над побочной диагональю должно выполняться равенство: i + j < N+1 ,т.е. в условии надо писать: if i + j <N+1 then …
6. Для элементов ниже побочной диагонали в предыдущем неравенстве надо всего лишь сменить знак на противоположный, т.е. здесь у нас будет: i + j > N+1, а в условии: if i + j > N+1 then …
7. Для элементов над пересечением диагоналей должны выполняться одновременно два неравенства: i + j < N+1 и i < j , т.е. в программе мы напишем if (i + j<N+1) and (i < j) then … (здесь скобки обязательны)
8. Для элементов под пересечением диагоналей знаки обоих предыдущих неравенств должны быть противоположными и будет это выглядеть так: i + j> N+1 и i > j ,или в программе: if (i + j> N+1) and (i > j) then … (здесь скобки обязательны)
9. Для элементов, находящихся справа от пересечения диагоналей справедлива закономерность: i + j <N+1 и i > j или в среде Pascal это будет выглядеть так: if (i + j<N+1) and (i >j ) then …
10. Для элементов, слева от пересечения диагоналей верно соотношение: i + j >N+1 и i < j ,а в программе это будет отражено как: if (i + j>N+1) and (i < j) then …
Ну вот в общем и всё. Вроде все закономерности описал.