//FPC 2.6.4 const m = 3; n = 3; var a : array[1..n, 1..m] of integer; max1: array[1..n] of integer; min1: array[1..n] of integer; max2: array[1..m] of integer; min2: array[1..m] of integer; i, j, min, max, count: integer; begin for i:=1 to n do for j:=1 to m do begin write ('Введите элемент матрицы [', i, ', ', j, ']: '); readln (a[i, j]); end;
for i:=1 to n do begin min:=a[i, 1]; max:=a[i, 1]; for j:=2 to m do begin if a[i, j]<min then min:=a[i, j]; if a[i, j]>max then max:=a[i, j]; end; min1[i]:=min; max1[i]:=max; end;
for j:=1 to m do begin min:=a[1, j]; max:=a[1, j]; for i:=2 to n do begin if a[i, j]<min then min:=a[i, j]; if a[i, j]>max then max:=a[i, j]; end; min2[j]:=min; max2[j]:=max; end;
writeln; writeln ('Введенная матрица: '); for i:=1 to n do begin for j:=1 to m do write (a[i, j]:6); writeln; end; writeln; count:=0; for i:=1 to n do for j:=1 to m do if ((a[i, j]=max1[i]) and (a[i, j]=min2[j])) or ((a[i, j]=max2[j]) and (a[i, j]=min1[i])) then begin writeln ('Седловая точка: [', i, ', ', j, ']'); inc (count); end; writeln ('Всего седловых точек: ', count); end.
/*задача дурацкая для n > 3, ибо не понятно, что делать: 1) разбить все столбцы на группы одинаковых столбцов и посчитать внутри них число пар. Затем суммировать. 2) разбить столбцы на группы одинаковых столбцов и суммировать количество элементов в каждой из групп, если оно больше 1. То есть найти количество столбцов, для которых среди других столбцов найдется хотя бы один идентичный ему 3) разбить столбцы на группы одинаковых столбцов и вывести количество элементов в каждой группе, если оно больше 1. Для n=3 дело проще, потому что таких групп максимум одна, поэтому тут, по сути, неоднозначности не возникает (за исключением того, что в первом пункте...) В общем, решил делать как во втором пункте. ответ в любом случае будет верным.*/ #include <iostream> using namespace std; int n, result = 0; int **ar;//указатель на указатель для создания динамического двумерного массива bool *Flag;//указатель на первый элемент массива флагов void create(int n)//создание динамического массива { ar = new int*[n]; for (int i = 0; i < n; i++) ar[i] = new int[n]; Flag = new bool[n]; for (int i = 0; i < n; i++) Flag[i] = false; } void inp(int n) //ввод элементов массива { cout << "Input rows of matrix:\n"; for (int i = 0; i < n; i++) { cout << i + 1 << ": "; for (int j = 0; j < n; j++) cin >> ar[i][j]; } } void outp(int n) //вывод элементов массива { cout << "Elements of matrix:\n"; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) cout << ar[i][j] << " "; cout << endl; } } bool isEqual(int n, int j1, int j2)//проверка на равенство столбцов { bool res = true; for (int i = 0; i < n; i++) { if (ar[i][j1] != ar[i][j2]) { res = false; break; } } if (res)//если столбцы равны Flag[j2] = true; /*отмечаем столбец как просмотренный, чтобы в следующий раз его не сравнивать с другими столбцами*/ return res; } void calculate(int n)//считаем количество совпадающих столбцов { int k = 1; for (int j1 = 0; j1 < n; j1++) if (!Flag[j1]) { k = 1; for (int j2 = j1 + 1; j2 < n; j2++) if (!Flag[j2] && isEqual(n, j1, j2)) k++; if (k > 1)//имеется k одинаковых стобцов по типу столбца j1 result += k;//плюсует к итоговому результату } } int main(){ cout << "Input n: "; cin >> n; create(n); inp(n);//ввод массива outp(n);//вывод массива calculate(n);//расчет того, что требуется if (result > 0)/*количество столбцов, которые совпадают, по крайней мере, с одним из других столбцов*/ cout << "The number of columns, coinciding with at least one other column, is " << result << endl; else //все столбцы разные cout << "There is no matching columns\n"; return 0; }
const
m = 3; n = 3;
var
a : array[1..n, 1..m] of integer;
max1: array[1..n] of integer;
min1: array[1..n] of integer;
max2: array[1..m] of integer;
min2: array[1..m] of integer;
i, j, min, max, count: integer;
begin
for i:=1 to n do
for j:=1 to m do
begin
write ('Введите элемент матрицы [', i, ', ', j, ']: ');
readln (a[i, j]);
end;
for i:=1 to n do
begin
min:=a[i, 1]; max:=a[i, 1];
for j:=2 to m do
begin
if a[i, j]<min then min:=a[i, j];
if a[i, j]>max then max:=a[i, j];
end;
min1[i]:=min; max1[i]:=max;
end;
for j:=1 to m do
begin
min:=a[1, j]; max:=a[1, j];
for i:=2 to n do
begin
if a[i, j]<min then min:=a[i, j];
if a[i, j]>max then max:=a[i, j];
end;
min2[j]:=min; max2[j]:=max;
end;
writeln;
writeln ('Введенная матрица: ');
for i:=1 to n do
begin
for j:=1 to m do write (a[i, j]:6);
writeln;
end;
writeln;
count:=0;
for i:=1 to n do
for j:=1 to m do
if ((a[i, j]=max1[i]) and (a[i, j]=min2[j]))
or ((a[i, j]=max2[j]) and (a[i, j]=min1[i])) then
begin
writeln ('Седловая точка: [', i, ', ', j, ']');
inc (count);
end;
writeln ('Всего седловых точек: ', count);
end.
1) разбить все столбцы на группы одинаковых столбцов и посчитать внутри них число пар. Затем суммировать.
2) разбить столбцы на группы одинаковых столбцов и суммировать количество элементов в каждой из групп, если оно больше 1. То есть найти количество столбцов, для которых среди других столбцов найдется хотя бы один идентичный ему
3) разбить столбцы на группы одинаковых столбцов и вывести количество элементов в каждой группе, если оно больше 1.
Для n=3 дело проще, потому что таких групп максимум одна, поэтому тут, по сути, неоднозначности не возникает (за исключением того, что в первом пункте...)
В общем, решил делать как во втором пункте. ответ в любом случае будет верным.*/
#include <iostream>
using namespace std;
int n, result = 0;
int **ar;//указатель на указатель для создания динамического двумерного массива
bool *Flag;//указатель на первый элемент массива флагов
void create(int n)//создание динамического массива
{
ar = new int*[n];
for (int i = 0; i < n; i++)
ar[i] = new int[n];
Flag = new bool[n];
for (int i = 0; i < n; i++)
Flag[i] = false;
}
void inp(int n) //ввод элементов массива
{
cout << "Input rows of matrix:\n";
for (int i = 0; i < n; i++)
{
cout << i + 1 << ": ";
for (int j = 0; j < n; j++)
cin >> ar[i][j];
}
}
void outp(int n) //вывод элементов массива
{
cout << "Elements of matrix:\n";
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
cout << ar[i][j] << " ";
cout << endl;
}
}
bool isEqual(int n, int j1, int j2)//проверка на равенство столбцов
{
bool res = true;
for (int i = 0; i < n; i++)
{
if (ar[i][j1] != ar[i][j2])
{
res = false;
break;
}
}
if (res)//если столбцы равны
Flag[j2] = true; /*отмечаем столбец как просмотренный, чтобы в следующий раз его не сравнивать с другими столбцами*/
return res;
}
void calculate(int n)//считаем количество совпадающих столбцов
{
int k = 1;
for (int j1 = 0; j1 < n; j1++)
if (!Flag[j1])
{
k = 1;
for (int j2 = j1 + 1; j2 < n; j2++)
if (!Flag[j2] && isEqual(n, j1, j2))
k++;
if (k > 1)//имеется k одинаковых стобцов по типу столбца j1
result += k;//плюсует к итоговому результату
}
}
int main(){
cout << "Input n: ";
cin >> n;
create(n);
inp(n);//ввод массива
outp(n);//вывод массива
calculate(n);//расчет того, что требуется
if (result > 0)/*количество столбцов, которые совпадают, по крайней мере, с одним из других столбцов*/
cout << "The number of columns, coinciding with at least one other column, is " << result << endl;
else //все столбцы разные
cout << "There is no matching columns\n";
return 0;
}