在 Delphi 中编写拉丁方块?

Programming a Latin Square in Delphi?

我正在尝试制作一个拉丁方程序,它接受用户输入的正方形大小(例如,输入 5 将生成 5x5 的拉丁方),然后将格式化后的正方形输出给用户。

如果您不知道什么是拉丁方或想查看我设置的实际任务,look no further

我已经对其中的一些代码进行了轻微编码,但我在第一个障碍上失败了。老师没有帮助,你们是我唯一的希望

uses
  System.SysUtils;

var
  // Variables

  // 2D array, size defined in main code
  Square: array of array of integer;
  // Integer holding the square size
  SquareSize: integer;

begin
  // Introduction
  writeln('This program will generate a Latin Squar of a size designated by you.');
  // Ask for user input, receive and store in a variable
  write('Enter the size of the Latin Square (1 value): ');
  readln(SquareSize);
  // More user friendly garbage
  writeln('Latin Square size: ', SquareSize, ' x ', SquareSize, '.');

  // Calculations

  // Set size of the 2D array to user designated dimensions
  setlength(Square, SquareSize, SquareSize);

end.

在最后一行代码 (setlength) 之后,我想将新二维数组中的所有值设置为用户输入的数字。我觉得。

除此之外,我不知道我在做什么。

如果你想帮助我,请你尽量保持简单,以便我能理解吗?

第一次在 Stack Overflow 上出现任何问题,我们深表歉意。

你给的link也给出了答案,看下面代码

program LatinSquare;

{$APPTYPE CONSOLE}

type 
  TSquare = array of array of Integer;

procedure WriteLatinSquare(var Square: TSquare; N: Integer);
var
  X, Y: Integer;
begin
  { Allocate and fill the square array. }
  SetLength(Square, N, N);
  for Y := 0 to High(Square) do
    for X := 0 to High(Square[Y]) do
      Square[X, Y] := (Y + X) mod N + 1;

  { Display the Square array. }
  for Y := 0 to High(Square) do
  begin
    for X := 0 to High(Square[Y]) do
      Write(Square[X, Y]:3);
    Writeln;
  end;
  Writeln;
end;

var
  Square: TSquare;
  SquareSize: Integer;

begin
  SquareSize := 6;
  WriteLatinSquare(Square, SquareSize);
  Readln;
end.

正如link所说:从1 2 3 4 5 6开始,然后下一行,移动一个,这样就变成了2 3 4 5 6 1,等等……这就是第一部分(使用 XY 循环)确实:它填满了正方形。

当然,Y + X 可以超过 0..5 的限制(我稍后添加 1),因此您使用 mod 将值包裹起来,因此 6 变为 07 变为 1,等等。实际上:

1st line: 0+0=0 -> 0, 0+1=1 -> 1, 0+2=2 -> 2, 0+3=3 -> 3, 0+4=4 -> 4, 0+5=5 -> 5
2nd line: 1+0=1 -> 1, 1+1=2 -> 2, 1+2=3 -> 3, 1+3=4 -> 4, 1+4=5 -> 5, 1+5=6 -> 0
3rd line: 2+0=2 -> 2, 2+1=3 -> 3, 2+2=4 -> 4, 2+3=5 -> 5, 2+4=6 -> 0, 2+5=7 -> 1
etc...

然后你加上 1,所以你得到的不是 0 1 2 3 4 5,而是 1 2 3 4 5 6

例程的第二部分仅打印 Square 数组。

如果不需要保存方块,可以一步完成:

procedure WriteMagicSquare2(N: Integer);
var
  X, Y: Integer;
begin
  for Y := 0 to N - 1 do
  begin
    for X := 0 to N - 1 do
      Write((Y + X) mod N + 1, ' ');
    Writeln;
  end;
  Writeln;
end;

输出(对于 N = 6):

1 2 3 4 5 6
2 3 4 5 6 1
3 4 5 6 1 2
4 5 6 1 2 3
5 6 1 2 3 4
6 1 2 3 4 5

假设你在我的学校,因为这是我从同一本书逐字逐句完成的作业。关于上面的代码,我要补充一点,拉丁方块的大小应该是用户输入的,所以在最后一段代码中将其更改为:

  var
  Square: TSquare;
  X, UserI, SquareSize: Integer;

begin
  X := 0;
  Writeln('type -1000 to stop the loop');
  repeat
    Writeln('What size square do you want?');
    readln(UserI);
    if UserI = -1000 then
    begin
      goto gotolable;
    end

    else
      SquareSize := UserI;
    WriteLatinSquare(Square, SquareSize);
    writeln ('Press enter to do another Latin square');
    readln;
  until X = 1;
gotolable: