Это скорее обсуждение, чем вопрос как таковой, поскольку я мог бы решить это с помощью кода, но я думаю, что должны быть лучшие способы сделать это.Упорядочить элементы в матрице любого размера
Мне нужно распределить элементы в матрице так, чтобы каждый квадрант матрицы (размеры которой не обязательно делимы на 4) содержит равное (или как можно более близкое) количество указанных элементов, но расположенное случайно в пределах этого квадранта. Остальная часть матрицы должна содержать случайные элементы другого типа.
Например, распределяя 10 элементов (А) в виде матрицы 9x6 может выглядеть следующим образом:
Который раскрывает проблему, что делать со средними линиями, когда измерение нечетное. Он может быть включен в один квадрант или другой случайным образом (тот факт, что нет как в 3 средних столбцах, просто шанс)
Сначала я подумал об этом с помощью рекурсивной функции, которая делит на квадранты и случайные места каждый элемент.
Я на полпути кодирования это в C#, идея в том, что-то вроде этого (он не работает, как еще и некоторые вещи, которые являются неэффективными, чтобы попытаться сделать код более читаемым):
private void PopulateQuadrants(ref Test5Target[,] matrix,
int xBeginQuadrant, int xEndQuadrant, int yBeginQuadrant, int yEndQuadrant, int targets)
{
if (targets == 0)
{
return;
}
else if (targets == 1)
{
Random rand = new Random();
matrix[rand.Next(xBeginQuadrant, xEndQuadrant), rand.Next(yBeginQuadrant, yEndQuadrant)]
= new Test5Target(ChosenTarget, UseAdvancedTargets);
for (int x = xBeginQuadrant; x < xEndQuadrant; x++)
{
for (int y = xBeginQuadrant; y < xEndQuadrant; y++)
{
if (matrix[x, y] == null)
{
int type = rand.Next(TargetCount);
while(type == ChosenTarget){
type = rand.Next(TargetCount);
}
matrix[x, y] = new Test5Target(rand.Next(TargetCount), UseAdvancedTargets);
}
}
}
return;
}
else
{
int[] TargetsPerQuadrant = { targets/4, targets/4, targets/4, targets/4 };
int RemaindingTargets = targets % 4;
Random rand = new Random();
while (RemaindingTargets > 0)
{ // Randomly select quadrants to allocate the Remainding targets (one may end up with 3 extra as it is now)
TargetsPerQuadrant[rand.Next(4)]++;
RemaindingTargets--;
}
PopulateQuadrants(ref matrix, xBeginQuadrant, xEndQuadrant/2, yBeginQuadrant, yEndQuadrant/2, TargetsPerQuadrant[0]);
PopulateQuadrants(ref matrix, xEndQuadrant/2, xEndQuadrant, yBeginQuadrant, yEndQuadrant/2, TargetsPerQuadrant[1]);
PopulateQuadrants(ref matrix, xBeginQuadrant, xEndQuadrant/2, yBeginQuadrant, yEndQuadrant/2, TargetsPerQuadrant[2]);
PopulateQuadrants(ref matrix, xEndQuadrant/2, xEndQuadrant, yBeginQuadrant/2, yEndQuadrant, TargetsPerQuadrant[3]);
}
}
Есть ли математически правильные или простые или что-то вроде этого, или я должен продолжать идти таким образом.