Как написать программу квадратную матрицы по диагонали

На вход программе подаются два натуральных числа n и m — количество строк и столбцов в матрице. Создайте матрицу mult размером n×m и заполните её таблицей умножения по формуле mult[i][j] = i * j .

n, m = int(input()), int(input()) for i in range(n): for j in range(m): if j != m — 1: print(str((i * j)).ljust(2), end=’ ‘) else: print(str((i * j)), end=») print()

На вход программе подаются два натуральных числа n и m — количество строк и столбцов в матрице, затем n строк по m целых чисел в каждой, отделенных символом пробела.

Напишите программу, которая находит индексы (строку и столбец) первого вхождения максимального элемента.

n, m = int(input()), int(input()) matrix = [[int(i) for i in input().split()] for _ in range(n)] row, col = 0, 0 for i in range(n): for j in range(m): if matrix[i][j] > matrix[row][col]: row,col = i, j print(row, col)

Напишите программу, которая меняет местами столбцы в матрице.

Как решать задачи по программированию. Пример: задача «Спираль»

n, m = int(input()), int(input()) matrix = [[int(i) for i in input().split()] for i in range(n)] change = [int(i) for i in input().split()] a, b = change[0], change[1] for i in range(n): matrix[i][a], matrix[i][b] = matrix[i][b], matrix[i][a] for row in matrix: print(*row)

Напишите программу, которая проверяет симметричность квадратной матрицы относительно главной диагонали.

n = int(input()) matrix = [[int(i) for i in input().split()] for j in range(n)] flag = True for i in range(n): for j in range(n): if matrix[i][j] != matrix[j][i]: flag = False if flag == False: print(‘NO’) break else: print(‘YES’)

Дана квадратная матрица чисел. Напишите программу, которая меняет местами элементы, стоящие на главной и побочной диагонали, при этом каждый элемент должен остаться в том же столбце (то есть в каждом столбце нужно поменять местами элемент на главной диагонали и на побочной диагонали).

n = int(input()) matr = [[int(i) for i in input().split()] for _ in range(n)] for i in range(n): for j in range(n): if (i == j) or (i == n — 1 — j): print(matr[n — 1 — i][j], end=’ ‘) else: print(matr[i][j], end=’ ‘) print()

Дана квадратная матрица чисел. Напишите программу, которая зеркально отображает её элементы относительно горизонтальной оси симметрии.

n = int(input()) matrix = [input().split() for _ in range(n)] for i in range(n // 2): matrix[i], matrix[n — i — 1] = matrix[n — i — 1], matrix[i] for row in matrix: print(*row)

Напишите программу, которая поворачивает квадратную матрицу чисел на 90∘ по часовой стрелке.

n=int(input()) matrix = [] for i in range(n): temp = [int(num) for num in input().split()] matrix.append(temp) for j in range(n): for i in range(n-1, -1, -1): print(matrix[i][j], end = ‘ ‘) print()

На шахматной доске 8×8 стоит конь. Напишите программу, которая отмечает положение коня на доске и все клетки, которые бьет конь. Клетку, где стоит конь, отметьте английской буквой N , клетки, которые бьет конь, отметьте символами * , остальные клетки заполните точками.

29 Вложенные списки Python


col, row = input().strip() coor_col = coor_row = arr = [[«N» if [i, j] == [coor_row[row], coor_col[col]] else ‘.’ for j in range(8)] for i in range(8)] for i in range(8): for j in range(8): if (coor_row[row] — i) * (coor_col[col] — j) in [-2, 2]: arr[i][j] = «*» for line in arr: print(*line, sep = ‘ ‘)

Магическим квадратом порядка nn называется квадратная таблица размера n×n, составленная из всех чисел 1,2,3,…,n 2 так, что суммы по каждому столбцу, каждой строке и каждой из двух диагоналей равны между собой. Напишите программу, которая проверяет, является ли заданная квадратная матрица магическим квадратом.

n = int(input()) # размерность матрицы matrix = [[int(i) for i in input().split()] for i in range(n)] # задаем матрицу matrix_90 = [[[] for i in range(n)] for i in range(n)] # матр., повернутая на 90гр count = 0 # счетчик для подсч. равенства строк начальной и повернутой матрицы diag_main = [] # список элементов главной диагонали diag = [] # список элементов побочной диагонали lst = [] # список элементов матрицы для исключения повторений и проверки от 1 до 1**n for i in range(n): diag_main.append(matrix[i][i]) # заполняем список элем-ми гл. диаг. diag.append(matrix[i][n — i — 1]) # заполняем список элем-ми побочн. диаг. for j in range(n): matrix_90[i][j] = matrix[n — j — 1][i] # заполняем повернутую на 90 матрицу if matrix[i][j] not in lst: lst.append(matrix[i][j]) # заполняем список учета всех элементов for i in range(n): if sum(matrix[i]) == sum(matrix_90[i]) == sum(diag_main) == sum(diag): count += 1 print(‘YES’ if count == n and len(lst) == n ** 2 and 0 not in lst else ‘NO’)

Источник: zazloo.ru

Заполнить двумерный массив зигзагом по диагонали

Требуется написать программу, которая заполняет массив размерности nxn по заданному правилу:

/* 1 3 4 10 11 2 5 9 12 19 6 8 13 18 20 7 14 17 21 24 15 16 22 23 25 */

То есть, заполнение массива должно быть по диагонали, сверху-вниз, слева-направо. Причем заполнение еще и зигзагообразное.

Смотрим результат работы программы:

Читайте также:
Нужные программы для Варфейс

По условию программы, массив — квадратная матрица, то есть имеет одинаковое количество строк и столбцов. Возможно это упростит задачу. Дам подсказку — рассмотрите массив как область в квадратной системе координат. То есть, для перемещения по элементам матрицы, мы условно будем пользоваться x и y координаты. х -координата — переменная, которая будет отвечать за перемещение по горизонтали (по столбцам), y -координата — отвечает за перемещение по вертикали (по строкам).

Мой способ решения состоит из двух этапов:

  • заполнение первой половины массива;
  • заполнение второй половины;

/* заполнение первой половины массива (строки 16 — 44) 1 3 4 10 11 2 5 9 12 0 6 8 13 0 0 7 14 0 0 0 15 0 0 0 0 */

ну и конечно же, заполнение остальной части массива (строки 48 — 76):

/* 0 0 0 0 0 0 0 0 0 19 0 0 0 18 20 0 0 17 21 24 0 16 22 23 25 */

Каждая часть массива заполняется отдельным циклом for , в котором перебор идет по диагоналям. Заметьте, что каждый новый столбец — это начало новой диагонали. Поэтому циклы for будут перебирать столбцы, предполагая, что это диагонали. То есть, каждая пройденная итерация цикла for — это заполненная диагональ.

Исходный код этой программы был бы в два раза меньше, но дело в том, что нужно организовать зигзагообразное заполнение. И поэтому, Для каждой заполняемой половины массива, нужно рассмотреть два случая:

  • заполнение диагонали снизу-вверх (для первой части — строки: 33 -42, второй части массива — строки: 65 — 74)
  • заполнение диагонали сверху-вниз (для первой части — строки: 20 -29, второй части массива — строки: 52 — 62)

И чтобы два способа заполнения диагоналей чередовались, мы делаем проверку в строке 18, для заполнения первой половины массива и в строке 50, для заполнения второй половины массива.

Непосредственно в циклах while выполняется заполнение диагоналей. В коде оставил много комментариев, надеюсь объяснил понятно.

#include #include using namespace std; int main() < const int colum = 10; // количество столбцов массива const int row = 10; // количество строк массива int array[100][100]; int x, y, // Координаты текущего элемента массива value = 1; // значение, которым заполняется массив // зполнение первой половины массива по диагонали, зигзагом, начиная // слева и сверху, заканчивая побочной диагональю for (int diag = 0; diag < colum; diag++) // выполняем проход по диагоналям < if (diag % 2 == 0) // по четным диагоналям < x = 0; // х-координата первого лемента массива на диагонали — diag y = diag; // у-координата элемента массива на диагонали — diag while (y >= 0) // пока y-координата находится в верхней части диагонали < array[x][y] = value; // записать значение в массив value++; x++; // по горизонтали, смещаемся влево y—; // по вертикали, смещаемся вниз >> else // по нечетным диагоналям < x = diag; // х-координата элемента массива на диагонали — diag y = 0; // у-координата первого элемента массива на диагонали — diag while (x >= 0) // пока x-координата находится в левой части диагонали < array[x][y] = value; // записать значение в массив value++; x -= 1; // по горизонтали, смещаемся вправо y += 1; // по вертикали, смещаемся вверх >> > // конец for // заполнение второй половины массива по диагонали, зигзагом, начиная // слева и сверху, заканчивая последним элементом массива for (int diag = 1; diag < colum; diag++) < if (diag % 2 == 0) // по четным диагоналям < x = 9; // х-координата первого элемента массива на диагонали — diag y = diag; // у-координата элемента массива на диагонали — diag while (y > else // по не четным диагоналям < x = diag; // х-координата первого элемента к-ой диагонали y = 9; // у-координата первого элемента к-ой диагонали while (x > // конец if-else > // конец цикла for (заполнение второй половины массива) // вывод масиива на экран for (int ix = 0; ix < row; ix++) < for (int jx = 0; jx < colum; jx++) cout return 0; >

Скорее всего мой код можно уменьшить, приблизительно в 2 раза, но у меня с ходу не получилось это сделать. Поэтому оставил все так. Если у вас получится уменьшить исходный код или найти другое решение, поделитесь с читателями нашего сайта. Ах да, я забыл реализовать в данной программе ввод размера массива, но я думаю это у вас получится и без меня. Пример работы программы:

CppStudio.com

1 3 4 10 11 21 22 36 37 55 2 5 9 12 20 23 35 38 54 56 6 8 13 19 24 34 39 53 57 72 7 14 18 25 33 40 52 58 71 73 15 17 26 32 41 51 59 70 74 85 16 27 31 42 50 60 69 75 84 86 28 30 43 49 61 68 76 83 87 94 29 44 48 62 67 77 82 88 93 95 45 47 63 66 78 81 89 92 96 99 46 64 65 79 80 90 91 97 98 100

Читайте также:
Написать программу которая проверяет является ли введенная с клавиатуры

Источник: cppstudio.com

8.6. Обработка квадратных матриц

Квадратной называют матрицу, у которой число строк равно числу столбцов. В общем случае обработка квадратных матриц принципиально не отличается от обработки прямоугольной матрицы. Для нее также используют вложенные циклы, с той лишь разницей, что диапазоны значений для внешнего и внутреннего счетчиков будут одинаковыми. Посмотрим, как изменяется текст программы ввода матрицы и вывода ее в окно списка при переходе от прямоугольной матрицы к квадратной.

Так как размеры у квадратной матрицы совпадают, то для их хранения достаточно одной переменной. В квадратной матрице nстрок иnстолбцов. Следовательно, вместо двух блоков ввода (ввод числа строк и ввод числа столбцов) будет один – ввод размера матрицы.

n = Val(InputBox(«Введите размер матрицы»))

Loop Until n > 0

Нумерация элементов в квадратной матрице идет также как и в прямоугольной – с нуля. Поэтому номера последней строки и столбца будут на единицу меньше соответствующего размера.

Выделяем память для хранения квадратной матрицы.

Организуем вложенные циклы для ввода элементов матрицы. Диапазоны значений счетчиков у этих циклов совпадают, так как совпадают размеры матрицы.

Вводим очередной элемент матрицы.

a(i, j) = Val(InputBox(«Введите элемент (» + _

С завершением вложенных циклов завершается и процесс ввода значений элементов квадратной матрицы. Начинаем процесс вывода матрицы в окно списка. Сначала это окно необходимо очистить от предыдущих результатов работы программы.

Затем мы выводим поясняющий заголовок.

Организуем вложенные циклы для вывода матрицы. Диапазоны значений счетчиков у этих циклов совпадают, так как совпадают размеры матрицы. В остальном процесс вывода квадратной матрицы ничем не отличается от вывода прямоугольной матрицы.

s += Str(a(i, j)) + vbTab

Полный текст программы обработки квадратной матрицы приведен в приложениях 41 и 42.

При обработке квадратных матриц можно использовать все алгоритмы, разработанные для прямоугольных матриц. Но существует ряд задач, характерных именно для квадратных матриц. Это задачи обработки элементов, находящихся на диагоналях матрицы или в одном из ее треугольников.

В квадратной матрице выделяют главную и побочную диагонали. Главная диагональ (см. рис. 56) идет из верхнего левого угла матрицы в правый нижний угол, то есть от элемента с индексами (0, 0) до элемента с индексами (n,n), гдеn– номер последнего столбца и строки матрицы. На каждой строке матрицы находится ровно один элемент, стоящий на главной диагонали. Для этого элемента всегда будет выполняться условиеi = j, гдеi– номер строки, аj– номер столбца.

Рис. 56. Главная диагональ квадратной матрицы

Главная диагональ разбивает матрицу на два треугольника. Все элементы верхнего треугольника расположены над главной диагональю. Для них выполняется условие i < j, гдеi– номер строки, аj– номер столбца. Все элементы нижнего треугольника расположены под главной диагональю. Для них выполняется условиеi >j, гдеi– номер строки, аj– номер столбца.

Как правило, элементы, стоящие на диагонали, не включаются ни в один треугольник. Если же по условию задачи требуется включить диагональные элементы в один из треугольников, то в соответствующем условии строгое неравенство заменяется на нестрогое. Условия главной диагонали и соответствующих треугольников проиллюстрированы на рис. 56.

Побочная диагональ (см. рис. 57) идет из верхнего правого угла матрицы в левый нижний угол, то есть от элемента с индексами (0, n) до элемента с индексами (n, 0), гдеn– номер последнего столбца и строки матрицы. На каждой строке матрицы находится ровно один элемент, стоящий на побочной диагонали. Для этого элемента всегда будет выполняться условиеi + j = n, гдеi– номер строки,j– номер столбца,n– номер последней строки и последнего столбца матрицы.

Рис. 57. Побочная диагональ квадратной матрицы

Побочная диагональ разбивает матрицу на два треугольника. Все элементы верхнего треугольника расположены над побочной диагональю. Для них выполняется условие i + j < n, гдеi– номер строки,j– номер столбца,n– номер последней строки и последнего столбца матрицы. Все элементы нижнего треугольника расположены под побочной диагональю.

Для них выполняется условиеi + j >n, гдеi– номер строки,j– номер столбца,n– номер последней строки и последнего столбца матрицы. Как правило, элементы, стоящие на диагонали, не включаются ни в один треугольник. Если же по условию задачи требуется включить диагональные элементы в один из треугольников, то в соответствующем условии строгое неравенство заменяется на нестрогое. Условия побочной диагонали и соответствующих треугольников проиллюстрированы на рис. 56.

Читайте также:
Написать программу определяющую является ли число совершенным

Рассмотрим особенности алгоритма обработки диагональных элементов на примере решения задачи определения суммы элементов, стоящих на главной диагонали, и произведения элементов, стоящих на побочной диагонали. Полученные результаты будем выводить в окно списка.

Объявляем переменные для хранения суммы и произведения.

Dim sum, proiz As Integer

И задаем им начальные значения.

Так как в каждой строке находится ровно один элемент с каждой диагонали, то для их обработки нам достаточно одного цикла, поскольку, зная номер строки, номер столбца можно вычислить, пользуясь условием соответствующей диагонали. Организуем цикл по всем строкам матрицы.

Для элементов главной диагонали выполняется условие i = j, то есть номер строки совпадает с номером столбца. Следовательно, если элемент стоит на главной диагонали и находится в строке с номеромi, то он будет стоять в столбце с номеромi. Таким образом, любой элемент с главной диагонали матрицыa(,)можно обозначитьa(i, i). Добавляем этот элемент к итоговой сумме.

Для элементов побочной диагонали выполняется условие i + j = n. Номер строкиiнам известен, равно как и значение переменнойn. Следовательно, мы можем из этого условия выразить значение переменнойj.

Тогда, если элемент стоит на побочной диагонали и находится в строке с номером i, то он будет стоять в столбце с номеромn — i. Таким образом, любой элемент с побочной диагонали матрицыa(,)можно обозначитьa(i, n — i). Включаем этот элемент в искомое произведение.

После завершения цикла печатаем полученные результаты. Сначала выводим горизонтальную черту, чтобы зрительно отделить исходные данные от результатов.

Затем печатаем значения суммы и произведения с поясняющим текстом.

lstMatrix.Items.Add(«Сумма left»> lstMatrix.Items.Add(«Произведение center»>

Рис. 58. Пример работы программы вычисления суммы элементов, стоящих на главной диагонали квадратной матрицы, и произведения элементов, стоящих на побочной диагонали квадратной матрицы

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

Описываем переменные для хранения минимального и максимального значений, а также их индексов.

Dim min, imin, jmin As Integer

Dim max, imax, jmax As Integer

Зададим начальное значение для минимума. Им может быть любой элемент, который всегда будет принадлежать к нужному треугольнику. Удобнее всего брать элемент, который расположен в вершине прямого угла (см. рис. 56 и рис. 57).

Для треугольника, расположенного выше главной диагонали, это будет элемент, находящийся в правом верхнем углу – a(0, n).

Задаем соответствующие начальные значения индексов.

Рассуждая аналогичным образом, зададим начальное значение для максимума. Так как нужный треугольник расположен ниже побочной диагонали, то это будет элемент, находящийся в правом нижнем углу – a(n, n).

Задаем соответствующие начальные значения индексов.

Организуем вложенные циклы для обработки всех элементов матрицы. Внешний цикл будет идти по строкам, а внутренний – по столбцам.

На каждом шаге цикла проверяем, принадлежит ли очередной элемент матрицы к треугольнику, расположенному выше главной диагонали, и меньше ли значение этого элемента, чем ранее найденный минимум.

Если на оба вопроса дан положительный ответ, значит надо обновить значение минимума, записав в соответствующую переменную значение анализируемого элемента матрицы.

При этом необходимо еще запомнить индексы текущего элемента.

Теперь проверяем, принадлежит ли очередной элемент матрицы к треугольнику, расположенному ниже побочной диагонали, и больше ли значение этого элемента, чем ранее найденный максимум.

If i + j > n And a(i, j) > max Then

Если на оба вопроса дан положительный ответ, значит надо обновить значение максимума, записав в соответствующую переменную значение анализируемого элемента матрицы.

При этом необходимо еще запомнить индексы текущего элемента.

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

Затем печатаем поясняющий текст и значения необходимых переменных.

lstMatrix.Items.Add(«Минимум над глав. диагональю»)

lstMatrix.Items.Add(«Максимум под побоч. диагональю»)

Полный текст программы представлен в приложении 42. Пример работы программы приведен на рис. 59.

Рис. 59.Пример работы программы поиска минимального из элементов, стоящих выше главной диагонали квадратной матрицы, и максимального из элементов, стоящих ниже побочной диагонали квадратной матрицы

Сформулируем основные правила обработки элементов матрицы, стоящих на любой диагонали или принадлежащих к одному из треугольников.

Источник: studfile.net

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru