Dies ist eher eine Diskussion als eine Frage per se, da ich dies mit Code lösen könnte, aber ich denke, es sollte bessere Möglichkeiten geben, dies zu tun.Elemente in einer Matrix beliebiger Größe anordnen
Ich muss Elemente in einer Matrix so verteilen, dass jeder Quadrant der Matrix (welche Dimensionen nicht unbedingt durch 4 teilbar sind) eine gleiche (oder so nahe wie möglich) Anzahl der Elemente enthält, aber zufällig angeordnet ist innerhalb dieses Quadranten. Der Rest der Matrix muss zufällige Elemente eines anderen Typs enthalten.
Zum Beispiel der Verteilung von 10 Elementen (A) in einer 9x6-Matrix könnte wie folgt aussehen:
Welche das Problem, was mit den Mittellinien zu tun, zeigt, wenn eine Dimension ungerade ist. Es könnte auf dem einen oder dem anderen Quadranten enthalten sein (die Tatsache, dass es keine As in den 3 mittleren Spalten gibt, ist Zufall)
Ich dachte zuerst daran, dies mit einer rekursiven Funktion zu behandeln, die sich in Quadranten und zufällige Orte aufteilt jedes Element.
Ich bin auf halbem Weg durch Codierung dies in C#, die Idee ist, so etwas wie diese (es funktioniert nicht als die noch und einige Dinge sind ineffizient, um zu versuchen den Code besser lesbar zu machen):
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]);
}
}
Gibt es mathematisch korrekte oder einfache oder etwas, um dies zu erreichen oder sollte ich auf diese Weise weitermachen?