Magic Square

Status
Nicht offen für weitere Antworten.
G

gast

Gast
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

Top Contributor
So z. B.

Code:
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();
		}
	}
}
 
V

Verzweifelt

Gast
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)?
 
S

SlaterB

Gast
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
 

Marco13

Top Contributor
Ach, ein ungerades magisches Quadrat zu füllen ist doch mit einer Zeile erledigt :cool:
Code:
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

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

Code:
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ß ;)
 
A

An-Java-Verzweiflerin

Gast
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

Top Contributor
Marco13 hat gesagt.:
Ach, ein ungerades magisches Quadrat zu füllen ist doch mit einer Zeile erledigt :cool:
...
(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....
Code:
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.
 
A

An- Java- Verzweiflerin

Gast
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!
 
A

An- Java- Verzweiflerin

Gast
Sollte es noch mal jemand brauchen...

:D
Java:
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);
  }
}
 
Zuletzt bearbeitet von einem Moderator:
K

kinglui

Gast
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

Top Contributor
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 ;) )?
 
K

kingele

Gast
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
 
G

Gast

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

The_S

Top Contributor
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.
 
G

guest

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

The_S

Top Contributor
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 ;) .
 
G

Gast

Gast
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

Top Contributor
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.
 
G

Gast

Gast
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

Top Contributor
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.:
Code:
  /*
   * Entfernt eine Zahl aus einem int-Array
   */
  private int[] remove(int number, int[] arr) {

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

Gast

Gast
versteh ich das so richtig?
Code:
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

Top Contributor
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.
 
G

Guest

Gast
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!
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben