Code: 3D Boxfiller

CodingIstToll

Newbie
Registriert
Nov. 2023
Beiträge
1
Folgender Code:

public enum Main {
;

public static void main(final String[] args) {
final int boxsize = 3;
final int anzahlshapes = 6;
final int rotation = 1;

final String[][][] box = new String[boxsize][boxsize][boxsize]; // 3D-Array für die Box

box[boxsize / 2][boxsize / 2][boxsize / 2] = "G";

final Form[] formes = new Form[anzahlshapes];

formes[0] = new Form(1, 3, 3);
formes[1] = new Form(1, 3, 3);
formes[2] = new Form(1, 1, 3);
formes[3] = new Form(1, 1, 2);
formes[4] = new Form(1, 1, 2);
formes[5] = new Form(1, 1, 1);

Main.solve(box, formes, 0);


}

public static void solve(final String[][][] box, final Form[] formes, final int currentIndex) {
// Basisfall: Wenn alle Formen platziert wurden, drucken Sie die Lösung oder tun Sie etwas damit
if (boxisfull(box)) {
Main.print(box);
return;
}

// Versuchen Sie, die aktuelle Form an verschiedenen Positionen und Rotationen zu platzieren
for (int x = 0; x < box.length; x++) {
for (int y = 0; y < box[0].length; y++) {
for (int z = 0; z < box[0][0].length; z++) {
for (int rotation = 1; rotation <= 6; rotation++) {
if (formes[currentIndex].canbeplaced(x, y, z, box)) {
formes[currentIndex].place(x, y, z, box, currentIndex + 1);
solve(box, formes, currentIndex + 1);
formes[currentIndex].remove(x, y, z, box);
}
}
}
}
}
}


private static void print(final String[][][] box) {

for (int z = 0; z < box[0][0].length; z++) {
for (int y = 0; y < box[0].length; y++) {
for (int x = 0; x < box.length; x++) {
System.out.print(box[x][y][z] + "\t");
}
System.out.println();
}
System.out.println();
}
System.out.println("----------");
}



public static boolean boxisfull(String[][][] box) {

for (int x = 0; x < box.length; x++) {
for (int y = 0; y < box[0].length; y++) {
for (int z = 0; z < box[0][0].length; z++) {
if (box[x][y][z] == null) {
return false; // Es gibt mindestens eine leere Stelle
}
}
}
}
return true;
}
}

class Form {

int xpos, ypos, zpos;
int xlength, ylength, zlength;
int ix, iy, iz;
char type;
int rotation = 1;

public Form(final int xlength, final int ylength, final int zlength) {
this.xlength = xlength;
this.ylength = ylength;
this.zlength = zlength;
ix = xlength;
iy = ylength;
iz = zlength;

if (xlength == ylength && ylength == zlength)
type = 'w';
else
type = 'q';
}



public void place(final int x, final int y, final int z, final String[][][] box, final int index) {
// Platzieren Sie die Form basierend auf den aktuellen Abmessungen
for (int i = 0; i < this.xlength; i++) {
for (int j = 0; j < this.ylength; j++) {
for (int k = 0; k < this.zlength; k++) {
// box[x + i][y + j][z + k] = Integer.toString(index);
box[x + i][y + j][z + k] = Integer.toString(index);
}
}
}
}

public void remove(final int x, final int y, final int z, final String[][][] box) {
for (int i = 0; i < this.xlength; i++) {
for (int j = 0; j < this.ylength; j++) {
for (int k = 0; k < this.zlength; k++) {
box[x + i][y + j][z + k] = null;
}
}
}
}

public void rotate() {
if (7 > this.rotation && 0 < this.rotation) {
switch (rotation) {
case 1:
xlength = this.ix;
ylength = this.iy;
zlength = this.iz;
break;
case 2:
xlength = this.iy;
ylength = this.iz;
zlength = this.ix;
break;
case 3:
xlength = this.iz;
ylength = this.ix;
zlength = this.iy;
break;
case 4:
xlength = this.ix;
ylength = this.iz;
zlength = this.iy;
break;
case 5:
xlength = this.iy;
ylength = this.ix;
zlength = this.iz;
break;
case 6:
xlength = this.iz;
ylength = this.iy;
zlength = this.ix;
break;
}
rotation++;
} else {
rotation = 1; // Zurücksetzen auf den Anfang, wenn rotation 6 erreicht.
this.rotate();
}
}

public boolean canbeplaced(final int x, final int y, final int z, final String[][][] box) {
for (int i = 0; i < this.xlength; i++) {
if (i + x >= box.length) {
return false;
}

for (int j = 0; j < this.ylength; j++) {
if (j + y >= box[0].length) {
return false;
}

for (int k = 0; k < this.zlength; k++) {
if (z + k >= box[0][0].length || null != box[x + i][y + j][z + k]) {
return false;
}
}
}
}
return true;
}
}

er soll eine box per backtrackign mit den gegebenen steinen füllen udn die lösung ausgeben. Seht ihr meinen Fehler?
 
Das ist kein valides C, C++, Fortran, Python,... Was soll es denn sein? Wieso bist du denn der Meinung, dass es einen Fehler gibt? Was sagt der Compiler?

Ich vermute, dass das:
Code:
for (int x = 0; x < box.length; x++) {
for (int y = 0; y < box[0].length; y++) {
for (int z = 0; z < box[0][0].length; z++) {

eher sowas sein sollte wie:
Code:
for (int x = 0; x < box.length; x++) {
for (int y = 0; y < box[x].length; y++) {
for (int z = 0; z < box[x][y].length; z++) {

habe aber jetzt auch nicht versucht dahinterzukommen, was hier eigentlich passieren soll...
 
Zuletzt bearbeitet: (code-tags, soll ja ordentlich sein ;))
Willkommen
  • Das Fragen nach Lösungen für Hausaufgaben, Übungszettel, Prüfungen etc. Zumindest dann nicht, wenn keine erhebliche Eigenleistung erkennbar ist.
Da Code bereits fertig ist, lasse ich das laufen. Aber: Was ist überhaupt das Problem?
Was geht nicht, kommt ein Fehler, macht der was falsch usw.?
 
Alter, so kann das doch keine S... lesen! Bitte erstmal die Programmiersprache nennen, den eingerückten code in die dafür vorgesehenen code-tags sowie Erklärung was rauskommen soll und was fälschlicherweise rauskommt und/oder Info über etwaige Fehlermeldungen. Ich gehe davon aus, dass jeder hier besseres zu tun hat als diese Wall of Code zu dechiffrieren...

Code-Tags kannst du zB so machen:
[code] print("hello world") [/code]

daraus wird:
Code:
print("hello world")
 
  • Gefällt mir
Reaktionen: zenokortin, madmax2010 und TorenAltair
das soll Java Code sein, oder? Nicht dass ich dann vestehe warum Main eine enum sein soll, aber ok.

Ansonsten, wie schon erwaehnt, niemand will hier unbekannten Code debuggen wenn
a) gar nicht bekannt ist was genau gemacht werden soll und
b) nicht gesagt wird was nicht geht

Davon abgesehen wuerde ich eh einen Debugger empfehlen und den Code dann halt zur Laufzeit durchgehen - sofern er denn kompiliert und ausfuehrbar ist
 
Sieht nach einer klassischen Eintagsfliege aus. Anmelden, Copy&Paste Code, Frage drunter "Wo ist der Fehler?" und 3 Minuten später ist man wieder raus, weil man sich nicht mal die Mühe gemacht hat, seinen eigenen Beitrag auf Lesbarkeit zu prüfen - warum auch, lesen müssen das ja andere.
Würde mich auch nicht wundern, wenn das nur kopierter Fremdcode ist und wir jetzt die Aufgabe lösen sollen.
 
  • Gefällt mir
Reaktionen: TorenAltair und BeBur
Bitte Code in Java-Code-Tags packen und formatieren.
Bitte beschreiben, wie die Aufgabenstallung ist.
Bitte die Lösungsidee beschreiben.
Bitte beschreiben, was noch nicht funktioniert.
Bitte etwaige Fehlermeldungen angeben.

So ist die Frage/dieses Thema unbrauchbar.

Btw. anbei ist mal mein Ansatz:

edit: Code wieder entfernt.
Ergänzung ()

Ich denke, das Problem ist hierbei:

Es gibt 125 Einsatzmöglichkeiten (Volumen). Für jede gibt es 3 Boxes, die jeweils in 6 Richtungen gedreht werden können.

Das wären 125^18 = 55511151231257827021181583404541015625 (etwa 10^37) Kombinationsmöglichkeiten.

Ich vermute, das ist in Java und mit modernen CPUs entweder nicht möglich oder es wäre jetzt vielleicht gerade so schaffbar.

Deshalb sollte zum Finden "des Musters" entweder die Problemgröße reduziert werden oder aber nicht das Backtracking-Verfahren angewendet werden.
 
Zuletzt bearbeitet:
Noch ne Anmerkung: Moderne CPU schaffen ca. 10^12 Instruktionen pro Sekunden (also 1 Billionen).

Wenn man jetzt davon ausginge, dass wirklich jede Kombination infrage käme, dann wären das noch
100 Trillionen Tage Bearbeitungszeit (300 Billiarden Jahre).

Zum Vergleich: Unser Universum ist erst 14 Milliarden Jahre alt.
 
@CyborgBeta Ich glaube du verschwendest deine Zeit. Wie schon angemerkt wurde der Threadopener seit dem Erstellen am Freitag hier nicht wieder gesehen und es wurde keinerlei Mühe in den Startpost gesteckt. Glaube nicht, dass da noch eine Rückmeldung kommen wird..
 
CyborgBeta schrieb:
Es gibt 125 Einsatzmöglichkeiten (Volumen). Für jede gibt es 3 Boxes, die jeweils in 6 Richtungen gedreht werden können.
Hab mich vertan.

Die Volumen der Quader sind 1, 8 und 12. Von jedem gibt es 6 Stück. Also ist das durchschnittliche Volumen 21/3=7. Also gibt es 125/7=ca. 18 Einsatzmöglichkeiten.

18^18 sind ca. 10^22. Damit würde das Ausprobieren wirklich aller Möglichkeiten "nur" ca. 300 Jahre dauern.
 
Zurück
Oben