22. november 2009 - 12:15Der er
14 kommentarer og 2 løsninger
Formattere en seedningsrækkefølge
Hej
Jeg er igang med et program, der bl.a. skal håndtere seedning af spillere i en turnering.
Jeg har brug for lidt hjælp til at lave en metode, der kan sortere en liste af spillere efter deres seedning.(antallet af spillere = n^2 = {2, 4, 8, 16 ... } - test ikke nødvendig)
Et eksempel er:
ved 2 spillere er rækkefølgen {1,2} Ved 4 spillere er rækkefølgen {1,4,2,3} Ved 8 spillere er rækkefølgen {1,8,4,5,2,7,3,6}
Parvis er summen = antal spillere + 1
Metoden skal tage en liste af spillere som parameter og skal returnere en sorteret list
public List<Spiller> seedning (List<Spiller> liste) { List<Spiller> sorteret = new List<Spiller>();
Jeg kan ikke give dig koden, da jeg ikke er så stiv i C# syntaks, men metoden er rimelig simpel:
De første 4 er givet (med 0 som start index): 0 = 1 1 = antal spillere -hvis antal spillere > 2: 2 = antal spillere/2 3 = (antal spillere/2) + 1 -hvis antal spillere > 4: kan du loope opad: hvis index mod 2 = 0 (4, 6, 8 osv): værdi = index/2 hvis index mod 2 = 1 (5, 7, 9 osv): værdi = antal spillere + 1 - (forrige index/2)
Det virker fint ved 8 spillere, men hvis jeg øger det til 16 spillere, så virker det ikke efter hensigten.
Her er min kode: String s = ""; s += "[" + 1 + "]"; s += "[" + antal + "]"; s += "[" + (antal / 2) + "]"; s += "[" + ((antal / 2) + 1) + "]"; for (int i = 4; i < antal; i++) { if (i % 2 == 0) { s += "[" + (i / 2) + "]"; } else { s += "[" + (antal + 1 - ((i - 1) / 2)) + "]"; } }
ved 16 spillere får jeg følgende resultat: 1 16 8 9 2 15 3 14 4 13 5 12 6 11 7 10 Det rigtige resultat er skal være: 1 16 8 9 4 13 5 12 2 15 7 10 3 14 6 11
Tallene bliver parvis sat rigtig sammen (summen giver antal + 1), men rækkefølgen er ikke rigtig. 1 - 2 skal mødes i finale 1 - 4 & 2 - 3 i semifinale 1 - 8 & 4 - 5 & 2 - 7 & 3 - 6 i kvartfinale etc ...
du kan gøre det på følgende måde: public static List<Spiller> seedning(List<Spiller> liste) { List<Spiller> sorteret = new List<Spiller>(); int start = 0, end = liste.Count - 1; while (start < end) { sorteret.Add(liste[start]); sorteret.Add(liste[end]); start++; end--; } return sorteret; }
kræver dog at din liste er sorteret i forvejen og at der er et lige antal spillere
her kommer lige en revideret løsning, kræver at man kan aflæse Seedningsnummeret fra en spiller, derfor har jeg lavet en dum spiller klasse med et seedningsnummer, det kan du jo bare rette til så det passer til din løsning:
public class Spiller { public int SeedNumber; }
public static List<Spiller> seedning(List<Spiller> liste) { List<Spiller> sorteret = new List<Spiller>(); sorteret.Add(liste[0]); int antal = liste.Count; while (sorteret.Count < antal) { int sum = (sorteret.Count * 2) + 1; int listeCount = sorteret.Count; for (int i = 0; i < listeCount; i++) { int pos = sum - sorteret[i+i].SeedNumber - 1; sorteret.Insert((i+i), liste[pos]); } } sorteret.Reverse(); return sorteret; }
Jeg har prøvet at køre dem begge to og de giver mig det ønskede resultat.
Jeg syntes, at det har været rigtig svært (for mig) at gennenskue en algoritme der kunne løse problemet, så det er dejligt, at i har taget jer tid til det :)
Vil i deles om pointene, så må i begge smide et svar
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.