# Puzzel - Rekursion



## WilderDenker (25. Mai 2011)

Ich soll ein neunteiliges Puzzel anordnen. Die linke obere Ecke ist der Fixpunkt, die anderen Eckteile können an den anderen verschiedenen Ecken angelegt werden. Das Mittelteil kann in alle 4 Richtungen gedreht werden. Die verbleibenden Randstücke können an den 4 unterschiedlichen Rändern angelegt werden. Der folgende Programmcode enthält aber auch, das die Randstücke in alle Richtungen gedreht werden können. 
Mein Problem ist, wer kann mir das Programm in Java umschreiben das es läuft. Ich komme mit damit nicht zu Rande. Ich bin im Mathe-Grundstudium und habe vor vielen Jahre die alten Programmiersprache Cobol  gelernt! 

Danke Eure Hilfe.


```
import java.io.*;
import java.util.*;
public class puzzel{

static int A=1, Z_1=2, B=3, Z_4=4, X=5, Z_2=6, D=7, Z_3=8, C=9, R1=10, R2=11, R3=12, R4=13;
int  [][] karte = {{Z_1,Z_4 ,R4 ,R1},{B ,X ,A ,R1},{R2 ,Z_2 ,Z_1,R1},
                  {X ,D ,R4 ,A}, {Z_2 ,Z_3 ,Z_4 ,Z_1}, {R2 ,C ,X ,B},
                  {Z_3 ,R3 ,R4 ,Z_4 }, {C , R3, D,X }, {R2, R3,Z_3, Z_2}};
final int [][][] belegung = new final int [3][3][2]; // [i][j][0] Kartennummer

void setup()
{
   setzeKarte(0);
}

void setzeKarte(int platz)
{
   int i,j, jmax , m, n;
   boolean frei , passt;
   int iplatz = platz % 3;
   int jplatz = platz / 3;

   for(int i=0; i<9; i++) // gehe ueber alle 9 Karten
   {
      frei = true;
      for(int j=0; j<platz; j++)
         frei = frei && (belegung [j%3][j/3][0] != i);
      if(frei) // noch nicht gelegt
      {
          jmax = (i==0 ? 0 : 3); // Karte 0 ist der Fixpunkt

          for(int j=0; j<= jmax; j++) // gehe ueber alle vier Drehungen
          {
             passt = true;
             if(iplatz !=0) // muss mit horizontalem Vorgaenger passen
                passt = passt && (karte[i][(6 -j)%4] + karte[belegung [iplatz -1][ jplatz ][0]][(4- belegung [iplatz -1][ jplatz ][1])%4] == 9);
             if(jplatz != 0) // muss mit vertikalem Vorgaenger passen
                passt = passt && (karte[i][(5 -j)%4] + karte[belegung [iplatz ][jplatz -1][0]][(3 - belegung [iplatz ][jplatz -1][1])%4] == 9);
             if (passt) // Karte passt
             {
                belegung [iplatz ][ jplatz ][0]=i; // Kartennummer
                belegung [iplatz ][ jplatz ][1]=j; // Drehung
                if(platz <8) // noch nicht alle Karten gelegt
                   return setzeKarte(platz+1);
                else
                {
                  System.out.println("Loesung gefunden !");
                  for(int n=0; n<3; n++)
                  {
                     for(int m=0; m <3; m++)
                      System.out.println("Karte "+( belegung [m][n][0]+1) +", gedreht um "+belegung [m][n][1]*90+ "‚°¶ , ");
                    System.out.println("\n");
                   }
                 }
               }
             }
           }
         }
       }
}
}
```
Danke für Eure Hilfe.


----------



## muckelzwerg (25. Mai 2011)

Da steht doch im Kommentar "gehe über alle vier Drehungen".
Und dann ist da eine Schleife, die bis zu vier mal durchlaufen wird.
In den Zeilen 41 und 42 werden das Puzzleteil und die Ausrichtung gesetzt. Die Ausrichtung ist vom Schleifenzähler j abhängig, wie Du dort sehen kannst.
Die Werte, die der Zähler "j" annimmt, ergeben sich aus der For-Schleife in Zeile 32.
Eine Zeile obendrüber ist die Sonderbehandlung des Fixpunktpuzzleteils. Daraus kannst Du doch eine entsprechende Sonderbehandlung anderer Teile ableiten.

a) Du hast überhaupt keinen Plan, was da abgeht. Dann lies Dich ein, probier rum, lerne und stell dann wieder konkrete Fragen.

b) Du hast keinen Plan von Java. Dann beschreib genauer, was dort passiert, welchen Teil Du ändern willst und frag nach wie Du Deine KONKRETEN Änderungswünsche in Java-Syntax formulieren musst.


----------



## Marcinek (25. Mai 2011)

Hallo,

wenn du möchtest, dass man das fertige hier schreibt, dann musst du einen Betrag in € > 0 angeben, der es dir Wert ist die Lösung zu erhalten.

Ansonsten bist du ja nicht so weit ab vom Schuss.. Was passiert den nicht oder welcher Fehler kommt?

Gruß,
Martin


----------



## WilderDenker (25. Mai 2011)

Hallo,

Der Aufruf von void setup() - ist in Java so nicht möglich. Die Methode main(), wo füge ich diese ein und bei public static void main(String[] args ).... , ich übergebe doch gar keine Parameter in Form eines String-Array oder ... 
Das Programm macht das im groben was ich will, nur es läuft nicht. 

Gruß
WD


----------



## chalkbag (25. Mai 2011)

mit


```
public class boolTest1 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new puzzel().setup();
	}
}
```

kannst du es doch aufrufen, wird dir halt nichts bringen, da keine Ausgabe bis dato erfolgt.

Die Änderungen in Java sind trivial, dass waren keine 5 Fehlermeldungen zum aktuellen Java Standard.



```
public class puzzel{
 
static int A=1, Z_1=2, B=3, Z_4=4, X=5, Z_2=6, D=7, Z_3=8, C=9, R1=10, R2=11, R3=12, R4=13;
int  [][] karte = {{Z_1,Z_4 ,R4 ,R1},{B ,X ,A ,R1},{R2 ,Z_2 ,Z_1,R1},
                  {X ,D ,R4 ,A}, {Z_2 ,Z_3 ,Z_4 ,Z_1}, {R2 ,C ,X ,B},
                  {Z_3 ,R3 ,R4 ,Z_4 }, {C , R3, D,X }, {R2, R3,Z_3, Z_2}};
final int [][][] belegung = new int [3][3][2]; // [i][j][0] Kartennummer
 
void setup()
{
   setzeKarte(0);
}
 
void setzeKarte(int platz)
{
   int  jmax ;
   boolean frei , passt;
   int iplatz = platz % 3;
   int jplatz = platz / 3;
 
   for(int i=0; i<9; i++) // gehe ueber alle 9 Karten
   {
      frei = true;
      for(int j=0; j<platz; j++)
         frei = frei && (belegung [j%3][j/3][0] != i);
      if(frei) // noch nicht gelegt
      {
          jmax = (i==0 ? 0 : 3); // Karte 0 ist der Fixpunkt
 
          for(int j=0; j<= jmax; j++) // gehe ueber alle vier Drehungen
          {
             passt = true;
             if(iplatz !=0) // muss mit horizontalem Vorgaenger passen
                passt = passt && (karte[i][(6 -j)%4] + karte[belegung [iplatz -1][ jplatz ][0]][(4- belegung [iplatz -1][ jplatz ][1])%4] == 9);
             if(jplatz != 0) // muss mit vertikalem Vorgaenger passen
                passt = passt && (karte[i][(5 -j)%4] + karte[belegung [iplatz ][jplatz -1][0]][(3 - belegung [iplatz ][jplatz -1][1])%4] == 9);
             if (passt) // Karte passt
             {
                belegung [iplatz ][ jplatz ][0]=i; // Kartennummer
                belegung [iplatz ][ jplatz ][1]=j; // Drehung
                if(platz <8){ // noch nicht alle Karten gelegt
                   setzeKarte(platz+1);
                	return;
                }else
                {
                  System.out.println("Loesung gefunden !");
                  for(int n=0; n<3; n++)
                  {
                     for(int m=0; m <3; m++)
                      System.out.println("Karte "+( belegung [m][n][0]+1) +", gedreht um "+belegung [m][n][1]*90+ "‚°¶ , ");
                    System.out.println("\n");
                   }
                 }
               }
             }
           }
         }
       }
}
```


----------

