A1 B1 C1 D1 E1 F1 G1 H1
A2 B2 C2 D2 E2 F2 G2 H2
A3 B3 C3 D3 E3 F3 G3 H3
A4 B4 C4 D4 E4 F4 G4 H4
E S N W w n s e
W E S N n s e w
N W E S s e w n
S N W E e w n s
E W N S
H A 1 2 3 4
D E 4 3 2 1
B G 2 1 4 3
F C 3 4 1 2
H3 A3 B4 G4
D2 E2 F1 C1
E W N S
A B 1 2 3 4
C D 4 3 2 1
E F 2 1 4 3
G H 3 4 1 2
This would give
A1 v C4
B1 v D4
E2 v G3
F2 v H3
public int[,] GetLatinSquare(List<int?> maxPositions)
{
var n = maxPositions.Count();
var latinSquare = new int[n, n];
for (int i = 0; i < n; i++)
{
var maxPosition = maxPositions[i];
if (maxPosition != null)
{
latinSquare[0, i] = maxPosition.Value;
}
}
for (var i = 0; i < n; i = i+2)
{
latinSquare[1, i] = latinSquare[0, i + 1];
latinSquare[1, i + 1] = latinSquare[0, i];
}
for (var i = 0; i < n; i = i + 4)
{
latinSquare[2, i] = latinSquare[0, i + 2];
latinSquare[2, i + 1] = latinSquare[0, i + 3];
latinSquare[2, i + 2] = latinSquare[0, i + 0];
latinSquare[2, i + 3] = latinSquare[0, i + 1];
}
for (var i = 0; i < n; i = i + 2)
{
latinSquare[3, i] = latinSquare[2, i + 1];
latinSquare[3, i + 1] = latinSquare[2, i];
}
return latinSquare;
}
public int[,] GetLatinSquare(List<int> maxPositions)
{
var n = maxPositions.Count();
var latinSquare = new int[n, n];
// Initialize Pattern
for (int i = 0; i < n; i++)
{
latinSquare[0, i] = maxPositions[i];
}
var start = 0;
var startIndex = 1;
// Start Processing Squares Starting with 2x2
while ((start = Convert.ToInt32(Math.Pow(2, startIndex))) <= n)
{
startIndex++;
for (int row = 0; row < start/2; row++)
{
var startRow = row;
var endRow = start - row - 1;
for (var i = 0; i < n; i = i + start)
{
var startColumn = i;
var endColumn = i + start - 1;
var columns = endColumn - startColumn + 1;
for (var column = 0; column < columns; column++)
{
latinSquare[endRow, startColumn] = latinSquare[startRow, endColumn];
endColumn--;
startColumn++;
}
}
}
}
return latinSquare;
}