В прямоугольной матрице выявить все квадратные подматрицы, у которых суммы элементов обеих диагоналей равны. - Pascal ABC
Формулировка задачи:
Задание: "В прямоугольной матрице выявить все квадратные подматрицы, у которых суммы элементов обеих диагоналей одинаковы."
В программе пошагово от самого 1 элемента берется подматрица(с 2 на 2 и так до d на d) и в ней считаются суммы диагоналей, но проблема в том, что с элементов ближе к правой и нижней стенки матрицы, подматрицы выходят за пределы самой матрицы и элементы за границей берутся соответственно за 0.
Собственно помощь нужна с тем, как это дело ограничить.
(Извиняюсь за изложение, не смог придумать как более доходчиво объяснить.)
Листинг программы
- program shtil;
- var a:array[1..10,1..10] of integer;
- m,n,d,i,j,ii,v,l,s1,s2:byte;
- begin
- write('Количество строк n=');
- readln(n);
- write('Количество столбцов m=');
- readln(m);
- if n<m then d:=n else d:=m;//максимальный размер подматриц
- writeln('Матрица');
- for i:=1 to n do
- for j:=1 to m do begin
- a[i,j]:=random(10);
- end;
- for i:=1 to n do begin
- for j:=1 to m do
- write(a[i,j]:2);
- writeln;
- end;
- writeln;
- for i:=1 to n do //матрица
- for j:=1 to m do begin //матрица
- for l:=2 to d do begin //подматрица размера от l до макс d
- v:=0;
- for ii:=i to (i+l-1) do//построчное перебирание подматриц
- begin
- s1:=a[ii,j+v]+s1;//сумма элементов главной диагонали
- writeln('s1 ',s1);
- s2:=a[ii,j+l-v-1]+s2;//сумма элементов побочной диагонали
- writeln('s2 ',s2);
- inc(v);//счетчик для нахождения элемента диагонали в каждой строке
- end;
- if s1=s2 then writeln('da') else writeln('net');
- s1:=0;s2:=0;
- end;
- end;
- end.
Решение задачи: «В прямоугольной матрице выявить все квадратные подматрицы, у которых суммы элементов обеих диагоналей равны.»
textual
Листинг программы
- //все элементы матрицы кроме последних строки и столбца
- for i:=1 to n-1 do
- for j:=1 to m-1 do
- //все подматрицы, их нижние правые углы
- for ii:=i+1 to n do
- for jj:=j+1 to m do
- if (ii-i in [2..d])and(ii-i=jj-j) then//входят в диапазон [2..d]
- begin
Объяснение кода листинга программы
- n - размер матрицы по первому измерению (количество строк)
- m - размер матрицы по второму измерению (количество столбцов)
- d - размерность матрицы (общая размерность матрицы, т.е. m*n)
- i - номер текущей строки
- j - номер текущего столбца
- ii - номер внутренней строки
- jj - номер внутреннего столбца
- [2..d] - диапазон чисел от 2 до d (включительно)
- if (ii-i in [2..d])and(ii-i=jj-j) then - проверка условия для каждой подматрицы
- (ii-i in [2..d]) - проверка, входит ли номер строки ii в диапазон [2..d]
- (ii-i=jj-j) - проверка, равны ли номера строк ii и jj, а также номера столбцов ii и j
- end if - завершение проверки условия для каждой подматрицы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д