# Magic Square



## gast (6. Apr 2006)

Hallo,

also meinen Frage bezieht sich auf ein magisches Quadrat.

ich möchte solch ein Quadrat erzeugen:

n=4
1,2,3,4
2,3,4,1
3,4,1,2
4,1,2,3


Meine überlegung: 

die Länge des zweidimensionalen Quadrat ist magic [n][n]

dann: for(i bis n
            for(j bis n)
                        magic[n] [n] =j;



problem: wie kann ich vertauschen, statt 1,2,3,4 in der zweiten zeile 2,3,4,1????????


hab schon gegoogelt. erhalte aber eha komplizierte lösungen  
wie 
http://www.informatik.uni-leipzig.de/~meiler/Java.dir/JavaWS03.dir/Programme/Felder/MagQuadrate.java


muss doch viel einfacher gehen.?

mfg

lars


----------



## The_S (6. Apr 2006)

So z. B.


```
public class MagicSquare {
	
	public static void main(String[] args) {
		
		int magicNumber = 4;
		int[][] square = new int[magicNumber][magicNumber];
		for (int i = 0; i < magicNumber; i++) {
			for (int j = i + 1, k = 0; k < magicNumber; k++, j++) {
				if (j > magicNumber) {
					j = 1;
				}
				square[i][k] = j;
			}
		}
		for (int i = 0; i < magicNumber; i++) {
			for (int j = 0; j < magicNumber; j++) {
				System.out.print(square[i][j]);
			}
			System.out.println();
		}
	}
}
```


----------



## gast (6. Apr 2006)

Danke. funktioniert perfekt


----------



## Verzweifelt (7. Aug 2007)

Ich soll eine Methode schreiben die überprüft ob ein gegegebenes zweidimensionales Array auch wirklich ein magisches Quadrat ist... Hab aber echt keinen Plan wie das gehn soll... Kann mir da wer helfen? (Code)?


----------



## SlaterB (7. Aug 2007)

was ist denn die Definition für ein magisches Quadrat?
siehste, was du per Hand nachrechnen kannst, kannst du so doch dem Computer als Aufgabe geben,

wenn dir natürlich die Addition von bestimmten Feldern an sich Probleme macht,
dann solltest du das vielleicht für sich lernen, nicht unbedingt mit einer Aufgabe vermischen


----------



## Milo (8. Aug 2007)

Hi,

das ist kein magisches Quadrat. Bei einem solchen darf jede Zahl nur einmal vorkommen. Die Summe der Spalten und Zeilen muss gleich sein. Einen Code für ungerade magische Quadrate gibts hier.

Milo


----------



## Marco13 (8. Aug 2007)

Ach, ein ungerades magisches Quadrat zu füllen ist doch mit einer Zeile erledigt  

```
class MagicSquare
{
    public static void main(String args[])
    {
        int n = 5;
        int a[][] = new int[n][n];
        f(n,1,n/2,n-1,a);
        print(a);
    }

    static int f(int ì,int i,int í,int î,int ï[][])
    {
        return i>ì*ì?i-1:(ï[í][î]=f(ì,i+1,(í+(i%ì==0?0:1))%ì,(î+(i%ì==0?-1:1))%ì,ï))-1;
    }

    public static void print(int a[][])
    {
        for (int i=0; i<a.length; i++)
        {
            for (int j=0; j<a[i].length; j++)
            {
                System.out.print((a[j][i]<10?" ":"")+a[j][i]+" ");
            }
            System.out.println();
        }
    }
}
```
(Nicht so ernst nehmen...  :wink: )


----------



## KoelOpa (9. Aug 2007)

hier der code, für nen check ob es ein magisches Quadrat is 


```
public boolean testMQ(int[][] arr)
  {
    boolean check = true;
    
    int olur = 0;
    int ulor = 0;
    
    for(int i = 0; i < arr.length; i++) olur += arr[i][i];
    for(int i = 0; i < arr.length; i++) ulor += arr[arr.length-1-i][i];

    for(int i = 0; i < arr.length; i++)
    {
      double zeilensumme = 0;
      double spaltensumme = 0;

      for(int j = 0; j < arr[i].length; j++)
      {
        zeilensumme += arr[i][j];
        spaltensumme += arr[j][i];
      }
      if(zeilensumme != olur || zeilensumme != ulor || spaltensumme != olur || spaltensumme != ulor) return false;
    }
    return check;
  }
```


Viel Spaß


----------



## An-Java-Verzweiflerin (21. Jan 2008)

Hey Leute, ich bin beim Suchen auf dieses Forum gestoßen. Ich sollte in Java ein Programm schreiben, das ein magisches Quadrat aus 7 Feldern erzeugt.
Nun habe ich das von Marco13 kopiert und bei mir ausgeführt, aber es war nicht korrekt, da ja die Zahl 1 in der Mitte der ersten Zeile stehen soll.
Kann mir jemand helfen? Es reicht also vollkommen ein Programm für ungerade Anzahl von Feldern und in der Ausgabe soll nicht nur das Magische Quadrat erscheinen, sondern auch die Magische Zahl: also die Summe der Diagonalen z.B
Ich danke euch schon einmal VIELMALS im Voraus und hoffe, dass ihr mir helfen könnte, weil ich so langsam wirklich am Verzweifeln bin... DANKE


----------



## Marco13 (21. Jan 2008)

Marco13 hat gesagt.:
			
		

> Ach, ein ungerades magisches Quadrat zu füllen ist doch mit einer Zeile erledigt
> ...
> *(Nicht so ernst nehmen...  :wink: )*



 :!:  (Du hättest doch nicht wirklich vor, sowas als Hausaufgabe abzugeben?! :shock: ) 

Versuch' einfach mal, es NICHT zu kopieren, sondern selbst zu schreiben... 

(Vermutlich bekommen Lehrer bald Fortbildungsseminare: "Wie man es schafft, Fragen zu stellen, die sich nicht durch 5 Minuten Googlen beantworten lassen")

Der Algorithmus um ein magisches Quardat der (ungeraden) Seitenlänge n zu erstellen ist nicht sooo kompliziert....

```
1. AktuellerWert ist 1
2. Schreibe in die mittlere Spalte der ersten Zeile den AktuellenWert
3. Wiederhole
{
    AktuellerWert += 1
    Gehe ein Feld nach oben. Wenn man dadurch nach oben aus dem Feld läuft, springe in die unterste Zeile
    Gehe ein Feld nach rechts. Wenn man dadurch nach rechts aus dem Feld läuft, springe in die linke Spalte.
    Setze dort den AktuellenWert

    Wenn der AktuelleWert ohne Rest durch n Teilbar ist
    {
        Gehe ein Feld nach unten. Wenn man dadurch nach unten aus dem Feld läuft, springe in die oberste Zeile
    }

} Bis AktuellerWert==n*n ist
```

Wenn was nicht klappt, poste dein (compilierbares) Programm hier, und beschreibe, was nicht funktioniert.


----------



## An- Java- Verzweiflerin (22. Jan 2008)

Also eigentlich habe ich an deinem Post rumgebastelt, bis es für mich richtig und plausibel erschien, aber das klappte nicht und als Test habe ich einige vermeintliche Lösungen aus dem Netz ausgeführt, die aber auch nicht gingen...

Und nein, das ist keine Hausaufgabe...

Dennoch danke für die Hilfe!


----------



## An- Java- Verzweiflerin (29. Jan 2008)

Sollte es noch mal jemand brauchen...



```
public class MagQuad {
  public static void main(String[] args) {
    int n;
    int i = 1;
    int x;
    int zeile = 0;
    int spalte = 0;

    TextIO.put("Bitte geben Sie die gewuenschte Anzahl der Felder ein (nur ungerade Zahlen): ");
    n=TextIO.getInt();

    if(n<0 || n==1 || n%2==0) {
      TextIO.putln("Die Anzahl muss ungerade sein!");
      System.exit(0);
    }
    
    int[][] feld = new int[n][n];
    zeile = 0;
    spalte = n/2;
    
    // Die Eins kommt immer in die Mitte der ersten Zeile.
    if(i==1) {
      feld[0][n/2]=i;
    }
     // Jetzt wird das Array befüllt
    while(i < n*n) {
      if(i%n == 0) {
        i++;
        zeile++;
        feld[zeile][spalte]=i;
      } else {
        i++;
        zeile--;
        spalte++;
        spalte=spalte%n;
        zeile=(zeile+n)%n;
        feld[zeile][spalte]=i;
      }
    }
    
    // Ausgabe des Arrays
  TextIO.putln("");
 
   for(zeile=0; zeile<n; zeile++){
      for(spalte=0; spalte<n; spalte++){
        x=feld[zeile][spalte];
    
        TextIO.put(x,4);
        TextIO.put("\t\t");
        
        if(spalte==n-1) {
          TextIO.putln("");
        } 
      }
    }
    
    int mag_zahl=0;
    mag_zahl=(n*((n*n)+1))/2;
    TextIO.putln("");
    TextIO.put("Die magische Zahl lautet: ");
    TextIO.putln(mag_zahl);
  }
}
```


----------



## kinglui (20. Nov 2008)

Hallo,
mir gefällt die Lösung von "Hobbit Im Blutrausch" eigentlich ganz gut, allerdings ist das doch sehr schematisch. Kann man nicht evtl eine Art Verifizierung implementieren, von wegen "Wenn eine deiner Nachbarzellen = du selbst bist, erhöhe dich um eins und prüfte die gesamte Zeile neu".

Wisst ihr, was ich meine?
(Ihr braucht mir keine Lösung geben, syntaktisch sollte es nicht solche Probs. geben, allerdings zweifel ich noch an der Richtigkeit meines Systems^^)

Schönen Tag noch


----------



## The_S (20. Nov 2008)

So mit Brutforce und Backtracking (sorry, kann auch sein, dass ich grad scheiße laber, hab aber grad keine Lust mir noch mal den ganzen Thread durchzulesen  )?


----------



## kingele (21. Nov 2008)

jiaaa, so ähnlich. mir geht es darum, mein quadrat nicht so aufzubauen, sondern mit einer Zahlenrange von 1-16 (N=4). 
daher muss ja gewährleistet sein, dass alle Summen stimmen -> backtracking


ciao


----------



## The_S (21. Nov 2008)

Bei meinem Sudoku-Solver verwende ich u. a. Backtracking. Evtl. kannst du dir da ja ein bisschen was abschauen!?

http://www.java-blog-buch.de/c-sudoku-solver/


----------



## Gast (21. Nov 2008)

okay, fangen wir einfach damit an:
mir fehlts an logik, wie ich zahlen gezielt aus der range hole


----------



## The_S (24. Nov 2008)

Ein Array mit allen möglichen Zahlen befüllen, eine zufällig auswählen und diese Einsetzen. Falls sie nicht eingesetzt werden kann => nächste Zahl wählen.


----------



## guest (24. Nov 2008)

aber dauert es dann nicht ewig, bzw wo steckt da ein System, dass alle Vertikalen/Diagonalen und Horizontalen befüllt werden?


----------



## The_S (24. Nov 2008)

Backtracking und Brutforce ist eben was anderes als "mit System". Musst dich schon entscheiden was du willst (oder generell mal die Frage genauer definieren).

Ewig dauern tut das bei so wenigen Feldern nicht. Eher ein paar Millisekunden  .


----------



## Gast (24. Nov 2008)

Hey!
Danke für deine Antworten 

Richtig, mit System wird das wohl nichts, will ja auch flexibel bleiben!

ich werde mich mal an die random() Variante machen und mich bei Probs wieder melden. Die Lösung von Marco sah vom Ergebnis ja eigentlich ganz brauchbar aus ^^


----------



## The_S (25. Nov 2008)

Nur mit random kannst du (wenns blöd läuft) aber Performanceprobleme bekommen. Stell dir vor, es ist nur noch eine Zahl möglich. Dann rufst du so oft random auf, bis die Zahl zufällig generiert wurde => langsam. Besser wäre es wie gesagt die möglichen Zahlen in ein Array zu füllen, nicht mögliche Zahlen aus dem Array zu werfen, und dann jeweils eine zufällige Zahl aus dem Array auswählen. So stellst du sicher, dass random nie "zu oft" aufgerufen wird.


----------



## Gast (25. Nov 2008)

Klar, das hatte ich von vornherein vor! leider habe ich noch keine Funktion gefunden, die ein schon benutzten Wert aus dem Array löscht. 
Ich würde es einfach so machen, dass ich die gebrauchte Zahl mit  irgendwas >n überschreibe, sie ans Arrayende schiebe und array.lenght um 1 inkrementiere.

So würden sie einfach hinten raus "fallen".  Hast du was eleganteres?


danke


----------



## The_S (25. Nov 2008)

Schau dir mein Sudoku an, da hab ich ne Methode zum Löschen eines Wertes aus einem Array geschrieben.



			
				Java-Blog-Buch.de hat gesagt.:
			
		

> ```
> /*
> * Entfernt eine Zahl aus einem int-Array
> */
> ...


----------



## Gast (26. Nov 2008)

versteh ich das so richtig? 

```
public class remove {

	public static void main(String[] args) {
		int[] array = new int[10];
		int[] arr = new int[5];
		int number = 3;
		
		for (int i = 0; i < array.length; i++)
			array[i]  = i;

		for (int i = 0, j = 0; i < arr.length; i++, j++) {
			if (arr[i] != number) {
				array[j] = arr[i];
			}
			else {
				j--;
			}
		}
		
		//return array;

for (int i : array)
	System.out.println(i);
	System.out.println("-- " + arr.length + " --");
	System.out.println("-- " + array.length + " --");
	}
}
```
kannst du mir sagen, wozu arr und number dienen?


danke


----------



## The_S (27. Nov 2008)

Warum verschiebst du meine Methode in die Main? Ich glaube du solltest dir noch mal ein bisschen die Basics angucken ...

arr ist das Array, aus dem eine Zahl entfernt werden soll. number ist die Zahl, die aus dem Array entfernt werden soll.


----------



## Guest (27. Nov 2008)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> Warum verschiebst du meine Methode in die Main? Ich glaube du solltest dir noch mal ein bisschen die Basics angucken ...
> 
> arr ist das Array, aus dem eine Zahl entfernt werden soll. number ist die Zahl, die aus dem Array entfernt werden soll.



Klaro, bin ja grad dabei!
Ins main hab ich sie verschoben, weil ich noch nicht bei eigenen Methoden angekommen bin 

Danke für deine Hilfe!


----------

