program Hledani_duplicit_v_dvourozmernem_poli;

uses crt;

const max = 10;

type pole = array[1..max,1..max]of integer;

var p: pole;
    i, j : integer;

procedure Vstup;
begin
  randomize;
  writeln('Jednotlive hodnoty pole budou vygenerovany nahodne v rozmezi 0 - 30');
  for i := 1 to max do
    for j := 1 to max do
      p[i,j] := random(31);
  writeln;
  writeln('Takto vypada vygenerovane pole : ');
  writeln;
  for i := 1 to max do
  begin
    write('     ');
    for j := 1 to max do
      write(p[i,j]:5);
    writeln;
  end;
end;

procedure Trideni;
const max2 = max*max;
var pom : array[1..max2] of integer;
    k : integer;
    poc, minimum : integer;
begin
  poc := 0;
  for i := 1 to max do
    for j := 1 to max do
    begin
      inc(poc);
      pom[poc] := p[i,j];
    end;
  for i := 1 to max2-1 do
  begin
    minimum := pom[i];
    k := i;
    for j := i+1 to max2 do
      if (minimum > pom[j]) then
      begin
        minimum := pom[j];
        k := j;
      end;
    pom[k] := pom[i];
    pom[i] := minimum;
  end;
  poc := 0;
  for i := 1 to max do
    for j := 1 to max do
    begin
      inc(poc);
      p[i,j] := pom[poc];
    end;
  writeln('Takto vypada setridene pole : ');
  writeln;
  for i := 1 to max do
  begin
    write('     ');
    for j := 1 to max do
      write(p[i,j]:5);
    writeln;
  end;
end;

procedure Duplicity;
var k, l, poc : integer;
begin
  i := 0;
  repeat
    Inc(i);
    k := i;
    j := 0;
    repeat
      Inc(j);
      l := j + 1;
      repeat
        if l > max then
        begin
          Inc(k);
          l := 1;
        end;
        if p[i,j] = p[k,l] then
        begin
          p[k,l] := 9999;
          Inc(l);
        end;
      until p[i,j]<> p[k,l];
      i := k;
      j := l - 1;
    until (j >= max) or (i > max);
  until i >= max;

  writeln('Cislem 9999 jsou oznaceny duplicitni prvky : ');
  for i := 1 to max do
  begin
    write('     ');
    for j := 1 to max do
      write(p[i,j]:5);
    writeln;
  end;

end;

BEGIN
  clrscr;
  gotoxy(11,2);  writeln('Program hledani duplicitnich prvku v dvourozmernem poli.');
  writeln;
  Vstup;
  writeln('Stiskni ENTER ...');
  readln;
  Trideni;
  writeln('Stiskni ENTER ...');
  readln;
  Duplicity;
  writeln('Stiskni ENTER ...');
  readln;
  clrscr;
END.