Jetzt wo die Lösungen öffentlich sind, möchte ich mal erklären wie ich daran gegangen bin und woran es bei mir gescheitert ist. Bei mir entstand
wahrscheinlich ein Integer Fehler durch eine Division. Ich hatte mich nämlich entschieden für die Aufgabe die mathematische
Binomialkoeffizient zu verwenden.
Ich bemerkte, solange n > 1 ist, können aufgerundet maximal n * n / 2 Felder gesetzt werden. Da man keine benachbarten Felder besetzen darf, kann man das ganze Feld ganz einfach Spiegeln solange n > 1 und n % 2 = 0 ist. Wenn n % 2 = 1, dann muss die letzte Spiegelung ausgelassen werden. Mit Spiegelung meine ich in diesem Fall, dass alle setzbaren Möglichkeiten von 0 bis n * n / 2 abgerundet, auf eine ganze Zahl dupliziert werden, da sie ebenfalls auf anderen Feldern stehen können.
|
Mein Code sieht wie folgt aus...
BigInteger getPossibilites(unsigned int n)
{
BigInteger result = 1;
unsigned int middleValue = n * n / 2;
n % 2 ? middleValue += 1 : 0;
for(int i = 1; i <= middleValue; i++)
{
BigInteger c = 1;
for(int m = 1; m <= i; m++)
c = c * (middleValue + 1 - m) / m;
n > 1 ? n % 2 && i == middleValue ? result += c : result += c * 2 : result += c;
}
return result;
}
Vielleicht findet jemand den Fehler, ich habe ihn nicht gefunden bzw. hatte keine Lust mehr und habe aufgegeben.
Liebe Grüße,
Domenic