magisches quadrat

sky1234

Grünschnabel
Hallo.

ich stehe vor folgender Aufgabe:

Ich soll ein "Magisches Quadrat" als Konsolenanwendeung realisieren.

Der Nutzer gibt die Kantenlänge n ein, dann wird ein Quadrat erstellt und geprüft (Zeilensumme=Spaltensumme=Diagonale Summe=magisches Quadrat).


Als Besonderheit soll es einfach nur mittels Backtracking realisiert werden, also solange testen bis eins gefunden wurde und ausgeben.

Ich weiß aber nicht wie man so ein virtuelles Quadrat anlegt, mit Zufallszahlen füllt und auch noch sicherstellt, dass eine Zahl nicht doppelt verwendet wird.

Für eine evtl. Hilfe bedanke mich.


ein Pseudocode könnte so aussehen, aber ich kann es nicht anwenden/Verstehen:
Code:
{
if (IsSquareFilled(...))
{
if (IsMagic(...))
{
// Ausgeben und abbrechen
}
}
else
{
/* Nummern durchlaufen, die gesetzt werden können
*/ Also noch nicht verwendet sind
for (...)
{
// Element in Quadrat an currentPos schreiben

// Rekursiver Aufruf
Create(currentPos, ...)

// Element an currentPos aus Quadrat löschen
}
}
}

mir würde auch schon helfen, wenn ich wüsste wie man überhaupt ein virtuelles Quadrat erstellt und diese virtuellen Felder dann auch noch mit Zufallszahlen füllen kann (ohne doppelte Zahl)
 
Zuletzt bearbeitet von einem Moderator:
ich hab hier ein Beispiel.
Allerdings hängt sich das Programm immer bei Zahlen >3 auf
Woran liegt das ?

C++:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define index(zeile, spalte) n*zeile + spalte
int  summZeile,summSpalte,summD1,summD2,magischeSumme,pruefw,j=1;
int *feld;
 
void pruef(int zeile, int spalte, int i, int n){
    if (zeile >= 0 && spalte >= 0 && zeile < n && spalte < n && pruefw <2){
        /*printf("Zeile: %d , Spalte: %d ",zeile,spalte);*/
        if (zeile == 0 && spalte == 0){
            /*printf("feld00: %d i: %d \n\n",feld[index(zeile,spalte)],i);*/
            if(feld[index(zeile,spalte)] == i){
            pruefw++;
            /*printf("Gleich00, pruefw: %d\n\n",pruefw);*/
            pruef(zeile-1,spalte-1,i,n);
            }
            pruef(zeile-1,spalte-1,i,n);
        }
        if (zeile != 0 && spalte == 0){
            /*printf("feldO: %d i: %d \n\n",feld[index(zeile,spalte)],i);*/
            if(feld[index(zeile,spalte)] == i){
            pruefw++;
            /*printf("GleichO, pruefw: %d\n\n",pruefw);*/
            pruef(zeile-1, n-1,i,n);
            }
            pruef(zeile-1, n-1,i,n);
        }
        else{
            if(spalte !=0){
                /*printf("ZeileU: %d , SpalteU: %d \n\n",zeile,spalte);*/
            /*printf("feldU: %d i: %d \n\n",feld[index(zeile,spalte)],i);*/
            if(feld[index(zeile,spalte)] == i){
            pruefw++;
            /*printf("GleichU, pruefw: %d\n\n",pruefw);*/
            pruef(zeile, spalte-1,i,n);
            }
            pruef(zeile, spalte-1,i,n);
            }
        }
    }
 
}
 
void summS(int zeile, int spalte, int n) {
    if (zeile >= 0 && spalte >= 0 && zeile < n && spalte < n){
        if (zeile == n-1){
            summSpalte += feld[index(zeile,spalte)];
        }
        else
        {
            summSpalte += feld[index(zeile,spalte)];
            summS(zeile+1, spalte,n);
        }
    }
}
 
void summDLR(int zeile, int spalte, int n) {
    if (zeile >= 0 && spalte >= 0 && zeile < n && spalte < n){
        summD1 += feld[index(zeile,spalte)];
        summDLR(zeile+1, spalte+1,n);
    }
}
 
void summDRL(int zeile, int spalte, int n) {
    if (zeile >= 0 && spalte >= 0 && zeile < n && spalte < n){
        summD2 += feld[index(zeile,spalte)];
        summDRL(zeile+1, spalte-1,n);
    }
}
 
void ausgabe(int zeile, int spalte, int n) {
    if (zeile >= 0 && spalte >= 0 && zeile < n && spalte < n){
        if (spalte == n-1){
            printf("%d \n",feld[index(zeile,spalte)]);
            ausgabe(zeile+1, 0,n);
        }
        else
        {
            printf("%d ",feld[index(zeile,spalte)]);
            ausgabe(zeile, spalte+1,n);
        }
    }
   
}
 
void eingabe(int zeile, int spalte, int i, int n) {
    if (zeile >= 0 && spalte >= 0 && zeile < n && spalte < n && i <= n*n+1){
        printf("Versuch: %d\n", j);
        j++;
        /*ausgabe(0,0,n);
        printf("\n");*/
        /*if(j==120){
            exit(0);
        }*/
        pruefw=0;
        /*summSpalte=0;*/
        if(i == n*n+1){
            //if(summSpalte != magischeSumme){
            //  summSpalte=magischeSumme;
            //  //ausgabe(0,0,n); /*später weg*/
            //  eingabe(0,0,(feld[index(0,0)]+1),n);
            //}
            if(spalte == 0){
                summZeile=(magischeSumme-(feld[index((zeile-1),(n-1))]));
                /*printf("Warnung, Wertfeld: %d, Zeile: %d, Spalte: %d\n",feld[index((zeile-1),(n-1))]+1,zeile,spalte);
                printf("Zeile-1: %d, Spalte n-1: %d\n",zeile-1,spalte=n-1);
                printf("SummeZeile : %d\n",summZeile);*/
                /*ausgabe(0,0,n);*/
                /*exit(0);*/
                eingabe((zeile-1),(n-1),(feld[index((zeile-1),(n-1))]+1),n);
                 
            }
            summZeile-=feld[index(zeile,spalte-1)];
            eingabe(zeile,spalte-1,(feld[index(zeile,spalte-1)]+1),n);
        }
        if (spalte == n-1){
           
            feld[index(zeile,spalte)]=i;
            pruef(zeile,spalte,feld[index(zeile,spalte)],n);
            /*printf("pruefw: %d gebrueft: %d \n\n",pruefw,feld[index(zeile,spalte)]);*/
            if(pruefw == 2){
                eingabe(zeile,spalte,i+1,n);
                pruefw=0;
            }
            pruefw=0;
            summZeile += feld[index(zeile,spalte)];
                if(summZeile != magischeSumme){
                    /*printf("Nicht magisch summZeile: %d \n\n",summZeile);*/
                    summZeile-=feld[index(zeile,spalte)];
                    /*ausgabe(0,0,n);*/
                    /*printf("\n");*/
                    eingabe(zeile,spalte,i+1,n);
                    /*exit(0);*/
                }
                else{
                    /*printf("Magisch summZeile: %d \n\n",summZeile);*/
                    /*pruef(zeile,spalte,i);*/
                    /*ausgabe(0,0);*/
                    /*printf("\n");*/
                    summZeile=0;
                    //ausgabe(0,0,n); /*später weg*/
                    eingabe(zeile+1,0,1,n);
                    /*pruef(zeile,spalte,i);*/
                    /*printf("pruefw: %d \n\n",pruefw);*/
                    printf("***Its Magic Wuhu***\n\n");
                    ausgabe(0,0,n);
                    printf("\n");
                    exit(0);
                }
        }
        else{
           
            feld[index(zeile,spalte)]=i;
            pruef(zeile,spalte,feld[index(zeile,spalte)],n);
            /*printf("pruefw: %d gebrueft: %d \n\n",pruefw,feld[index(zeile,spalte)]);*/
            if(pruefw == 2){
                eingabe(zeile,spalte,i+1,n);
                pruefw=0;
            }
            pruefw=0;
            if(zeile == n-1 && spalte == 0){
            summSpalte=0;
            summS(0,spalte,n);
            /*printf("SummSpalte: %d\n\n",summSpalte);*/
            if(summSpalte != magischeSumme){
                /*summSpalte=0;*/
                //ausgabe(0,0,n); /*später weg*/
                eingabe(zeile,spalte,i+1,n);
            }
            if(summSpalte == magischeSumme){
                summD2=0;
                summDRL(0,n-1,n);
                if(summD2 != magischeSumme){
                    eingabe(zeile,spalte,i+1,n);
                }
                //ausgabe(0,0,n); /*später weg*/
                /*exit(0);*/ /*test*/
                summSpalte=0;
            }
            }
            summZeile += feld[index(zeile,spalte)];
            eingabe(zeile, spalte+1,/*i+1*/1,n);
        }
    }
}
 
int main() {
    int n;
    scanf("%d",&n);
    printf("\n");
    magischeSumme=(n*n*n+n)/2;
    summSpalte=magischeSumme;
 
    feld = (int *) malloc(n*n*n*sizeof(int));
    if (feld == NULL) {
        printf("Malloc-Error!\n");
        return 1;
    }
   
    eingabe(0,0,1,n);  
    getchar();
    return 0;
}
 
Zuletzt bearbeitet von einem Moderator:
Zurück