Intro:
Tijdens het organiseren van een half-jaarlijkse kaartmarathon, waar we de hele dag rikken, mag ik me bezighouden met het technische gedeelte om snel alle mensen in te delen voor aanvang.
Nu doe ik dat nog door elke deelnemer een willekeurige plaats toe te wijzen per ronde.
Probleem:
Hoewel het merendeel zeer te spreken is over wat de applicatie tot nu toe doet, blijft er steeds dezelfde vraag terugkomen: "Hoe komt het dat ik meer dan eens bij persoon a aan tafel heb gezeten en niet één keer bij persoon b.
Daarom ben ik nu op zoek naar een manier om alle deelnemers in te delen voor een x aantal rondes zonder dat zij meer dan eens bij een ander aan tafel zitten.
Het idee is dat ik nu indelingen genereer, zodat ik die later kan invullen met personen.
Afgelopen keer waren we met 40 deelnemers en hebben we 10 rondes gespeeld. Dat schema zou er dus sowieso uit moeten kunnen rollen.
Pre-condities:
spelersAantal % 4 = 0. (Rikken speel je met zijn vieren
)
spelersAantal > maxRonde * 3. (Per ronde 3 tafelgenoten)
Om een mogelijk schema te genereren ben ik aan slag gegaan met backtracking in c++.
Ik hoop dat onderstaande code duidelijk maakt wat het idee is.
Het probleem waar ik nu tegenaan loop is dat het idioot lang duurt als het aantal rondes oploopt of het spelersaantal afneemt.
Algemene vraag:
Wat doe ik verkeerd?
SEA-vragen:
- Zijn er andere algoritmen om dit probleem te tackelen?
- Is mijn implementatie misschien inefficiënt op sommige punten?
PRG-vraag:
- Kan ik door andere datatypen te gebruiken mijn code sneller maken? Zo ja, waar?
Alle overige opmerkingen zijn natuurlijk ook welkom.
Voor degenen die niet weten wat Rikken is.
Tijdens het organiseren van een half-jaarlijkse kaartmarathon, waar we de hele dag rikken, mag ik me bezighouden met het technische gedeelte om snel alle mensen in te delen voor aanvang.
Nu doe ik dat nog door elke deelnemer een willekeurige plaats toe te wijzen per ronde.
Probleem:
Hoewel het merendeel zeer te spreken is over wat de applicatie tot nu toe doet, blijft er steeds dezelfde vraag terugkomen: "Hoe komt het dat ik meer dan eens bij persoon a aan tafel heb gezeten en niet één keer bij persoon b.
Daarom ben ik nu op zoek naar een manier om alle deelnemers in te delen voor een x aantal rondes zonder dat zij meer dan eens bij een ander aan tafel zitten.
Het idee is dat ik nu indelingen genereer, zodat ik die later kan invullen met personen.
Afgelopen keer waren we met 40 deelnemers en hebben we 10 rondes gespeeld. Dat schema zou er dus sowieso uit moeten kunnen rollen.
Pre-condities:
spelersAantal % 4 = 0. (Rikken speel je met zijn vieren
spelersAantal > maxRonde * 3. (Per ronde 3 tafelgenoten)
Om een mogelijk schema te genereren ben ik aan slag gegaan met backtracking in c++.
Ik hoop dat onderstaande code duidelijk maakt wat het idee is.
Het probleem waar ik nu tegenaan loop is dat het idioot lang duurt als het aantal rondes oploopt of het spelersaantal afneemt.
Algemene vraag:
Wat doe ik verkeerd?
SEA-vragen:
- Zijn er andere algoritmen om dit probleem te tackelen?
- Is mijn implementatie misschien inefficiënt op sommige punten?
PRG-vraag:
- Kan ik door andere datatypen te gebruiken mijn code sneller maken? Zo ja, waar?
Alle overige opmerkingen zijn natuurlijk ook welkom.
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
| struct speler{ int nr; vector<int> tafelPerRonde; }; int maxRonde = 2; int spelersAantal = 32; vector<speler> spelers(spelersAantal); vector<vector<int>> spelersPerRonde(maxRonde); bool deelIn(int speler, int ronde) { if(speler == spelersAantal) // nieuwe ronde return deelIn(0,ronde+1); if(ronde == maxRonde) // alle rondes ingedeeld return true; for(int i = 0; i < spelersAantal; i++) // alle stoelen proberen { if(spelersPerRonde[ronde][i] == -1) // stoel onbezet { bool veilig = true; for(int j = 0; j < 4; j++) // vergelijken met overige tafelgenoten { if(j != i%4 && spelersPerRonde[ronde][(i-(i%4))+j] != -1) // niet eigen stoel en geen lege stoel { for(int k = 0; k < ronde; k++) // alle voorgaan ronden bekijken { if(spelers[speler].tafelPerRonde[k] == spelers[spelersPerRonde[ronde][(i-(i%4))+j]].tafelPerRonde[k]) // als je al aan tafel hebt gezeten veilig =false; } } } if(veilig) { spelersPerRonde[ronde][i] = speler; // speler plaatsen spelers[speler].tafelPerRonde[ronde] = (int)i/4; if(deelIn(speler+1, ronde)) // volgende speler return true; else { spelersPerRonde[ronde][i] = -1; // stoel leegmaken spelers[speler].tafelPerRonde[ronde] = -1; // van tafel schoppen } } } } return false; } int main() { ... Initialisatie op -1 ... if(deelIn(0,0)) cout << "Gelukt" << endl; } |
Voor degenen die niet weten wat Rikken is.
Mijn post is interessanter dan mijn Sig..