Ik heb een veld van 5*5
Waar ik 2 kleuren van 5 pionnen op zet
Deze zijn onderling uitwisselbaar zonder een probleem
Ik besef dat Voor de eerste kleur er 53130 mogelijkheden zijn (Gevonden in programma)
ik reken op 20 velden die nog kunnen ingevuld
En de andere kleur is dan 15504 (want er zijn maar 15 lege velden meer (5 afgevallen door de andere kleur))
Dus in het totaal zijn er 823 727 520 mogelijkheden
Ik heb dit wel gevonden door een programma
Als ik de eerste kleur * 15504 doe
en dan de 2de kleur er bij op tel
kom ik voor elk getal een unieke stelling (De spiegelgetallen ga ik er uithalen door het kleinste getal te nemen)
Voor kleur 1 te bereken veronderstel ik dat kleur 2 niet bestaat (werkt gemakkelijker voor kleur 2)
Geg[0] = aantal lege velden tot de eerste pion
Geg[1] = aantal lege velden tussen pion 1 en 2
Geg[2] = aantal lege velden tussen pion 2 en 3
Geg[3] = aantal lege velden tussen pion 3 en 4
Geg[4] = aantal lege velden tussen pion 4 en 5
Geg[5] = aantal lege velden tussen pion 5 en einde
De som van deze getallen is dus altijd 20
Ik heb het volgende gevonden
Mijn nummer van mijn stelling is dan
(Kleur 1 * aantalmogelijkheden kleur 2) + kleur 2
Enkel Kleur 1 interesseer me
Ik heb mogelijkheid 0 als begin mogelijkheid en daar is alles 0 buiten Geg[5] die is 20
Kleur1 = Geg[4] + (Geg[3]+Geg[4]+Geg[5]+1.5 - Geg[3]/2)*Geg[3])+ ?Iets met Geg[2] + ?iets met Geg[1] + Iets met Geg[0]
Het volgende kan helpen
Wanneer Geg[2]=1 en Geg[5] =19 kom ik op 231
Wanneer Geg[2]=2 en Geg[5] =18 kom ik op 441
Wanneer Geg[2]=3 en Geg[5] =17 kom ik op 631
...
Veel geluk
Ik heb er al 5h aan besteed maar niet meer gevonden
Mogelijkheden van pionnen op een Veld
Re: Mogelijkheden van pionnen op een Veld
Kijk eens naar https://nl.wikipedia.org/wiki/Combinatie_(wiskunde).
Om k=5 witte pionnen te verdelen over n=25 velden zijn er
mogelijkheden.
Om vervolgens k=5 zwarte pionnen te verdelen over de n=20 overgebleven velden zijn er
mogelijkheden.
Op veel wetenschappelijke rekenmachines vind je een nCr-toets (of iets wat daarop lijkt) om deze aantallen uit te rekenen.
Volgens mij wil je nu elk van die combinaties voorzien door een rangnummer, en wil je:
- bij elke combinatie het rangnummer kunnen bepalen
- bij elk rangnummer de bijbehorende combinatie bepalen.
Klopt dat?
En in welke programmeertaal werk je?
Om k=5 witte pionnen te verdelen over n=25 velden zijn er
mogelijkheden.
Om vervolgens k=5 zwarte pionnen te verdelen over de n=20 overgebleven velden zijn er
mogelijkheden.
Op veel wetenschappelijke rekenmachines vind je een nCr-toets (of iets wat daarop lijkt) om deze aantallen uit te rekenen.
Volgens mij wil je nu elk van die combinaties voorzien door een rangnummer, en wil je:
- bij elke combinatie het rangnummer kunnen bepalen
- bij elk rangnummer de bijbehorende combinatie bepalen.
Klopt dat?
En in welke programmeertaal werk je?
Re: Mogelijkheden van pionnen op een Veld
Van elke combinatie de rangnummer bepalen is uiteindelijk de bedoeling
De rangnummer naar de combinatie zou handig zijn maar als ik het bovenliggende kan dan kan ik dat door benadering
Vul in tot het groter is dan de combinatie die ik wil hebben moet ik eentje minder nemen en dan met de volgende zijn lege velden schuiven
Ik heb dit enkel nodig voor mijn database op te kuisen
Ik werk met c# (dus die zal misschien wel zo een functie bevatten)
De rangnummer naar de combinatie zou handig zijn maar als ik het bovenliggende kan dan kan ik dat door benadering
Vul in tot het groter is dan de combinatie die ik wil hebben moet ik eentje minder nemen en dan met de volgende zijn lege velden schuiven
Ik heb dit enkel nodig voor mijn database op te kuisen
Ik werk met c# (dus die zal misschien wel zo een functie bevatten)
Re: Mogelijkheden van pionnen op een Veld
Mocht je het kunnen gebruiken: hieronder wat C code voor je probleem.
Deze code kan je waarschijnlijk redelijk eenvoudig omzetten naar C#.
Mogelijk moet je de output functie printf vervangen door cout.
De tabel comb[26][6] bevat alle combinaties die we nodig hebben (= van 0C0 t/m 25C5).
Deze worden in wf_pionnen() berekend zoals in de driehoek van Pascal
(zie https://nl.wikipedia.org/wiki/Driehoek_van_Pascal).
De 25 vakken van het speelveld zijn gecodeerd met nummers 1 t/m 25,
De plaats van de pionnen zit in de vector v: v[0] t/m v[4] bevatten (in oplopende volgorde) de positie van de pionnen op het veld:
Onderstaande code geeft deze output:
v = [1, 2, 3, 5, 7]
heeft rangnummer 8
rangnummer 5 geeft
v = [1, 3, 4, 5, 6]
Deze code kan je waarschijnlijk redelijk eenvoudig omzetten naar C#.
Mogelijk moet je de output functie printf vervangen door cout.
De tabel comb[26][6] bevat alle combinaties die we nodig hebben (= van 0C0 t/m 25C5).
Deze worden in wf_pionnen() berekend zoals in de driehoek van Pascal
(zie https://nl.wikipedia.org/wiki/Driehoek_van_Pascal).
De 25 vakken van het speelveld zijn gecodeerd met nummers 1 t/m 25,
De plaats van de pionnen zit in de vector v: v[0] t/m v[4] bevatten (in oplopende volgorde) de positie van de pionnen op het veld:
Code: Selecteer alles
vak: 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
r=1 v0 v1 v2 v3 v4
r=2 v0 v1 v2 v3 v4
r=3 v0 v1 v2 v3 v4
r=4 v0 v1 v2 v3 v4
r=5 v0 v1 v2 v3 v4
r=6 v0 v1 v2 v3 v4
r=7 v0 v1 v2 v3 v4
r=8 v0 v1 v2 v3 v4
...
r=53129 v0 v1 v2 v3 v4
r=53130 v0 v1 v2 v3 v4
v = [1, 2, 3, 5, 7]
heeft rangnummer 8
rangnummer 5 geeft
v = [1, 3, 4, 5, 6]
Code: Selecteer alles
int comb[26][6];
int v[5];
// print vector v op beeldscherm:
void printv(void)
{
int i;
printf("v = [%d", v[0]);
for(i=1;i<5;i++)
printf(", %3d",v[i]);
printf("]\n");
}
// zet rangnummer r om naar vector v:
void rangnummer2vector(int r)
{
int idx;
int c;
r--;
for(idx=4;idx>=0;idx--){
v[idx]=idx+1;
c = comb[v[idx]][idx+1];
while(r>=c){
v[idx]++;
c = comb[v[idx]][idx+1];
}
r-=comb[v[idx]-1][idx+1];
}
}
// zet vector v om naar rangnummer:
int vector2rangnummer(void)
{
int r=1;
int idx;
for(idx=0;idx<5;idx++)
r += comb[v[idx]-1][idx+1];
return(r);
}
// combinatie <=> rangnummer demo:
void wf_pionnen(void)
{
int n,k,r;
// maak combinatietabel:
comb[0][0]=1;
for(k=1;k<6;k++)
comb[0][k]=0;
for(n=1;n<26;n++){
comb[n][0]=1;
for(k=1;k<6;k++)
comb[n][k] = comb[n-1][k-1] + comb[n-1][k];
}
// voorbeeld 1: vector -> rangnummer
v[0]=1;
v[1]=2;
v[2]=3;
v[3]=5;
v[4]=7;
printv();
printf("heeft rangnummer %d\n\n", vector2rangnummer());
// voorbeeld 2: rangnummer -> vector
r=5;
rangnummer2vector(r);
printf("rangnummer %d geeft\n", r);
printv();
}
Re: Mogelijkheden van pionnen op een Veld
mijn Excuses
De Volgende dingen zoek ik te vermijden
Een databank op te slaan met 823 727 520 waar telkens de indexers in zitten
Dan Zoek ik gewoon in de databank op de positie
en Alle voorliggende mogelijkheden te berekenen
telkens ik een bepaalde wil berekenen
Anders zou ik
Telkens laten rekenen eerst het eerste getal overeenkomt dan de volgende ...
Maar dat zou te lang duren (denk ik)
De Volgende dingen zoek ik te vermijden
Een databank op te slaan met 823 727 520 waar telkens de indexers in zitten
Dan Zoek ik gewoon in de databank op de positie
en Alle voorliggende mogelijkheden te berekenen
telkens ik een bepaalde wil berekenen
Anders zou ik
Telkens laten rekenen eerst het eerste getal overeenkomt dan de volgende ...
Maar dat zou te lang duren (denk ik)
Code: Selecteer alles
private void GenereerMogelijkeSpeelvelden(int MogelijkeVerplaatsvelden, int AantalPionen, int ActievePion, int ReedsGebruikteVerplaatsvelden)
{
if (AantalPionen == ActievePion)
{
Counter++; // Deze Schrijf ik weg
}
else
{
for (int i = 0; i < MogelijkeVerplaatsvelden - ReedsGebruikteVerplaatsvelden + 1; i++)
{
DezeMogelijkheid[ActievePion] = i;
GenereerMogelijkeSpeelvelden(MogelijkeVerplaatsvelden, AantalPionen, ActievePion + 1,
ReedsGebruikteVerplaatsvelden + i);
}
}
}
Re: Mogelijkheden van pionnen op een Veld
De oplossing die arie je gaf helpt hierbij en vermijdt wat je noemt denk ik. Denk je van niet? Zo ja, hoezo?Whrothus schreef:Van elke combinatie de rangnummer bepalen is uiteindelijk de bedoeling
Stap 1 van het oplossen van een probleem is te erkennen dat je een probleem hebt.
(Raffiek Torreman)
(Raffiek Torreman)