const m=5;
var matr:array[1..m,1..m] of byte;
i,j:byte;
st:set of byte=[];
function check(s1,s2:byte):boolean;
var u:byte;
begin
result:=true;
for u:=1 to m do if matr[s1,u]<>matr[s2,u] then begin
result:=false;
break;
end;
end;
begin
randomize;
for i:=1 to m do
for j:=1 to m do read(matr[i,j]);
for i:=1 to m do begin
if not(i in st) then begin
for j:=1 to m do
if (i<>j) and (check(i,j)) then begin //убрал одну проверку
writeln(i,' ',j);
st:=st+[i]+[j];
end;
end;
end;
readln;
end.
var printed: boolean;
{ ... }
for i := 1 to m do
begin
printed := false;
if not (i in st) then
begin
for j := i + 1 to m do
if check(i, j) then
begin
if not printed then
begin
write(i, ' ');
printed := true;
end;
write(j, ' ');
st := st + [i, j];
end;
end;
if printed then writeln;
end;
Во-первых, условие (i <> j) тоже оказывается лишним, а во-вторых, более правдоподобный (ну, скажем, более ожидаемый) вывод результата: на матрице