uses crt;
const nmax=20;
var a:array[1..nmax+1,1..nmax] of integer;
n,m,i,j,k,p:byte;
x:integer;
begin
clrscr;
randomize;
repeat
write('Количество строк=');
readln(m);
until m in [1..nmax];
repeat
write('Количество столбцов=');
readln(n);
until n in [1..nmax];
for i:=1 to m do
for j:=1 to n do
a[i,j]:=random(8);
{подсчет количества разных в столбцах}
for j:=1 to n do
begin
k:=m;{пока все разные}
for i:=1 to m-1 do{идем вниз по столбцу}
for p:=i+1 to m do{смотрим элементы, которые ниже}
if a[i,j]=a[p,j] then{если есть такой}
begin
k:=k-1;{вычитаем 1}
break;{дальше не смотрим}
end;
a[m+1,j]:=k;{результат записываем в дополнительную строку}
end;
writeln('Исходная матрица:');
for i:=1 to m do
begin
write(' ':9);
for j:=1 to n do
write(a[i,j]:4);
writeln;
end;
write('Кол.разн.');
for i:=1 to n do
write(a[m+1,i]:4);
writeln;
writeln;
{сортируем строки матрицы=переставляем столбцы}
for j:=1 to n-1 do
for p:=j+1 to n do
if a[m+1,j]<a[m+1,p] then{по убыванию элементов в дополнительной строке}
for i:=1 to m+1 do {соответственно переставляем элементы во всех строках}
begin
x:=a[i,j];
a[i,j]:=a[i,p];
a[i,p]:=x;
end;
writeln('Перестановка столбцов по убыванию количества разных элементов в них:');
for i:=1 to m do
begin
write(' ':9);
for j:=1 to n do
write(a[i,j]:4);
writeln;
end;
write('Кол.разн.');
for i:=1 to n do
write(a[m+1,i]:4);
readln
end.