Latin négyzet (3. verzió)

 

Az előző két Latin négyzet-generáló programokhoz képest ez a program kész meglepetés. A megengedett maximális oldalméret 100 x 100. Bármilyen oldalméretet is választunk, a program észrevétlenül gyorsan generál véletlen Latin négyzetet. A trükk felfedezését érdeklődő olvasóimra bízom. A generált táblázatot itt is lemezre menthetjük.

 

A Latin négyzetek nagy segítséget nyújtanak az egyik kedvelt rejtvény, a Soduku tábláinak előállításában. Nem lehetetlen, hogy az órarendkészítő programok is használni tudnak, elég nagy oldalszámú Latin négyzetet.

 

A program futási képe:

 

 

         A program listája:

 

unit ULUjLatin;

interface

uses
  Windows, MessagesSysUtilsClasses,

  GraphicsControlsFormsDialogs, StdCtrlsGrids;

type
  TfmLUJLatin = class(TForm)
    lbLatinTLabel;
    edNTEdit;
    btStartTButton;
    btKilepTButton;
    sgLatinTStringGrid;
    btMentesTButton;
    edNevTEdit;
    procedure btKilepClick(SenderTObject);
    procedure FormCreate(SenderTObject);
    procedure btStartClick(SenderTObject);
    procedure btMentesClick(SenderTObject);
  private
    Private declarations }
  public
    Public declarations }
  end;

Const Max=100;
var
  fmLUJLatinTfmLUJLatin;
  N: Word;
  T: Array[1..Max,1..Max] Of Word;
  P: Array[1..Max] Of Word;
  DNevString;
  FTextText;

implementation

{$R *.DFM}

procedure TfmLUJLatin.btKilepClick(SenderTObject);
begin
  Close;
end;

procedure TfmLUJLatin.FormCreate(SenderTObject);
begin
  Randomize;
end;

procedure TfmLUJLatin.btStartClick(SenderTObject);
Var I, J, K, L, PP, M: Word;
begin
  N:= StrToInt(edN.Text); If N>Max Then Exit;
  edNev.Text:= edN.Text;
  For I:= 1 To N Do P[I]:= I; M:= Max+Random(Max);
  For I:= 1 To M Do
  Begin
    K:= Random(N)+1; L:= Random(N)+1;
    PP:= P[K]; P[K]:= P[L]; P[L]:= PP;
  End;
  For I:= 1 To N Do T[I,1]:= P[I];
  For J:= 2 To N Do
  Begin
    For I:= 1 To N-1 Do T[I,J]:= T[I+1,J-1];
    T[N,J]:= T[1,J-1];
  End;
  M:= Max+Random(Max);
  For I:= 1 To M Do
  Begin
    K:= Random(N)+1; L:= Random(N)+1;
    For J:= 1 To N Do P[J]:= T[K,J];
    For J:= 1 To N Do T[K,J]:= T[L,J];
    For J:= 1 To N Do T[L,J]:= P[J];
  End;
  M:= Max+Random(Max);
  For I:= 1 To M Do
  Begin
    K:= Random(N)+1; L:= Random(N)+1;
    For J:= 1 To N Do P[J]:= T[J,K];
    For J:= 1 To N Do T[J,K]:= T[J,L];
    For J:= 1 To N Do T[J,L]:= P[J];
  End;
  With sgLatin Do
  Begin
    ColCount:= N+1; RowCount:= N+1;
    For I:= 1 To N Do
    Begin
      Cells[I,0]:= IntToStr(I);
      Cells[0,I]:= IntToStr(I);
    End;
    For I:= 1 To N Do For J:= 1 To N Do Cells[I,J]:= IntToStr(T[I,J]);
  End;
end;

procedure TfmLUJLatin.btMentesClick(SenderTObject);
Var I, J: Word;
begin
  DNev:= edNev.Text+'.csv';
  AssignFile(FText,DNev); ReWrite(FText);
    With sgLatin Do
    For I:= 1 To RowCount-1 Do
    Begin
      For J:= 1 To ColCount-1 Do Write(FText,Cells[J,I],';');
      WriteLn(FText);
    End;
  CloseFile(FText);
end;

end.