Wie schreibe ich eine "alle diese Zahlen sind anders" Bedingung in Java?

8

OK, ich habe dieses Problem zu lösen, aber ich kann es nicht in Java richtig programmieren. Sehen Sie das Bild unten, Sie werden einen 6-zackigen Stern sehen, wo jeder Punkt und jeder Schnittpunkt der Linien ein Buchstabe ist.

Die Aufgabe besteht darin, die Zahlen 1 bis 12 so zu positionieren, dass die Summe aller vier Kugelreihen 26 ist und die Summe aller 6 Punkte des Sterns ebenfalls 26 ist. Das kommt auf:

  • (A + C + F + H == 26)
  • (A + D + G + K == 26)
  • (B + C + D + E == 26)
  • (B + F + I + L == 26)
  • (E + G + J + L == 26)
  • (H + I + J + K == 26)
  • (A + B + E + H + K + L == 26)

Also habe ich angefangen, ein Programm zu programmieren, das alle Optionen durchläuft, um eine Lösung zu finden. Die Schleife funktioniert, zeigt jedoch jetzt Lösungen an, bei denen eine Zahl mehr als einmal verwendet wird, was nicht erlaubt ist. Wie kann ich es im Code machen, dass es auch prüft, ob alle Variablen unterschiedlich sind oder nicht?

%Vor%

Ich habe das obige versucht, aber es funktioniert nicht, weil es sagt:

  

unvergleichbare Typen: boolean und int.

Wie kann ich innerhalb von 1 oder einer kleinen Aussage überprüfen, ob alle Zahlen unterschiedlich sind oder nicht?

(anstatt eine verschachtelte 12 * 12-Anweisung zu erstellen, die jede Variablenkombination überprüft)

Das ist mein Code bisher:

%Vor%     
Javaaaa 06.12.2010, 11:55
quelle

4 Antworten

1

Ihre verschachtelten Schleifen führen 12^12 = 8.91610045E12 IF-Statements aus, von denen viele wegen falscher Zahlenkombinationen ungültig sind. Du brauchst Permutationen von 1,2,3,..,12 als Kandidaten für deinen Bruteforcing-Ansatz. Die Anzahl der Permutationen von 12 Elementen ist 12!= 479 001 600 , also wird das Bruteforcing viel schneller sein, denke ich. Wenn Sie nur gültige Permutationen generieren, brauchen Sie keine Überprüfung auf gültige Kombinationen.

Hier ist ein Beispielcode, der Code in nextPerm () wird vom Permutationsgenerator kopiert und geändert:

> %Vor%     
Michael Konietzka 06.12.2010, 19:40
quelle
11

Wenn ich es richtig verstehe, wollen Sie überprüfen, ob alle A bis L eindeutig sind. Also lege sie einfach in ein Set und finde die Größe des Sets:

%Vor%     
Abhinav Sarkar 06.12.2010 12:02
quelle
5

Ich rate dringend, stattdessen die Rekursion zu verwenden, was den Code erheblich vereinfachen würde. Tun Sie etwas wie folgt:

%Vor%

Um jedoch Ihre Frage direkt zu beantworten: Sie können alle Werte in ein setze und überprüfe, ob seine Größe der Anzahl der Gegenstände entspricht, die du geworfen hast. Das funktioniert, weil ein Set Duplikate als eins zählt.

    
marcog 06.12.2010 12:03
quelle
2

Bevor Sie nach einer guten Lösung für Sie suchen, möchte ich mit dem Fehler helfen, den Sie erhalten.

if ((A= C != D != E != F != G != H != I != J != K != L)){

Diese Zeile macht nicht viel Sinn. Das erste, was der Compiler überprüft, ist:

if (A=C)

Sie wollten wahrscheinlich if (A!=C) codieren, aber überlegen wir uns, was Sie wirklich eingeben. A=C ist eine Attribution, daher wird A C value erhalten.

Dann wird der Compiler weitermachen. Nach der Zuordnung von C zu A wird der Vergleich überprüft:

if (A=C != D)

Dies wird den A Wert mit D vergleichen, was zu einem booleschen Wert führt - sagen wir, dass das Ergebnis false ist.

Der nächste Vergleich wäre:

if (false != E)

An diesem Punkt gibt es einen Vergleich zwischen einem booleschen Wert und einem int, daher der Fehler incomparable types: boolean and int. .

Nun, da Sie überprüfen müssen, ob Ihre Zahlen eindeutig sind, wäre eine gute Lösung die von @ abhin4v vorgeschlagen.

    
Paulo Guedes 06.12.2010 12:17
quelle

Tags und Links