Двухмерный массив: Магический квадрат

Магический квадрат — это квадратная таблица, заполненная n*n чисел таким образом, что сумма чисел в каждой строке, каждом столбике и на обеих диагоналях одинакова.
Сумма чисел в каждой строке, столбике и по диагоналям, называется магической постоянной.
Как проверить, является ли заданный квадрат магическим.

Задача. Дан массив N*N. Eсли заданный массив является магическим – выведите фразу «Квадрат магический и магическая постоянная =», в противном случае — выведите «Квадрат не магичен».
При размерности массива N=3 мы должны найти сумму элементов 3-ох строк и 3-ох столбцов. Также
нужна сумма по главной и вторичной диагоналям. Соответственно для хранения этих сумм нужен массив на 3+3+2 элементов или 2*n+2.</p>
Будем использовать следующие переменные:
N: размерность массива;
Kst: счетчик совпавших сумм;
K: счетчик элементов линейного массива сумм;
Matrix: основной массив элементов;
SumRowCol: массив для хранения сумм по строках, столбцах, диагоналях;
Sum_Col, Sum_Row, Sum_MainDiag, Sum_SecondDiag: переменные для подсчета сумм.

Алгоритм решения задачи.
1. Найти суммы элементов по столбикам
2. Найти суммы элементов по строкам
3. Найти суммы элементов по диагоналям
4. Просчитать количество совпавших значений сумм. Если количество совпавших сумм = 2*N+2 тогда квадрат магический и его магическая постоянная равна любой из сумм (например — первой), в противном случае — не магичный.

 
const
 n = 3;

var
 i, j, kst, k: integer;
 Matrix: array[1..n, 1..n] of integer;
 SumRowCol: array [1..2 * n + 2] of longint;
 Sum_Col, Sum_Row, Sum_MainDiag, Sum_SecondDiag: longint;

BEGIN
 
 {заполнение массива пользователем} 
 for i := 1 to n do
 begin
 for j := 1 to n do
 begin
 write('A[',i, j, ']=');readln(Matrix[i, j]);
 end;
 end;
 
 {Поиск сумм строк и столбцов}
 k := 1;
 for i := 1 to n do
 begin
 Sum_Col := 0;
 Sum_Row := 0;
 for j := 1 to n do
 begin
 Sum_Row := Sum_Row + Matrix[i, j];
 Sum_Col := Sum_Col + Matrix[j, i];
 end;
 SumRowCol[k] := Sum_Row;
 inc(k);
 SumRowCol[k] := Sum_Col;
 inc(k);
 end;
 
 {Поиск суммы главной диагонали} 
 Sum_MainDiag := 0;
 for i := 1 to n do
 Sum_MainDiag := Sum_MainDiag + Matrix[i, i];
 
 SumRowCol[k] := Sum_MainDiag;
 inc(k);
 
 
 {Поиск суммы вторичной диагонали}
 Sum_SecondDiag := 0;
 for i := 1 to n do
 begin
 for j := 1 to n do
 begin
 if i + j = n + 1 then Sum_SecondDiag := Sum_SecondDiag + Matrix[i, j];
 end;
 end;
 
 SumRowCol[k] := Sum_SecondDiag;
 
 {Количество совпадающих сумм строк и столбцов}
 kst := 0;
 for i := 1 to 2 * n + 2 do
 if SumRowCol[i] = SumRowCol[1] then inc(kst);
 
 {если количество совпадающих сумм совпало с количеством искомых сумм то... иначе...}
 if kst = 2 * n + 2 then writeln('Квадрат магический и магическая постоянная=', SumRowCol[1]) else writeln('Квадрат не магичен');
 
END.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Подписаться
Уведомить о
guest
0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии