Mein Code sieht zur Zeit so aus:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define index(zeile, spalte) n*zeile + spalte
int anzahl,n,summZeile=0, summSpalte=0,summD1=0,summD2, magischeSumme,zaehlerZ, zaehlerS,j=1; /*nur test später löschen j */
int *feld;
void ausgabe(int,int);
void summZ(int,int);
void summS(int,int);
void summDLR(int,int);
void summDRL(int,int);
void eingabe(int zeile, int spalte, int i) {
if (zeile >= 0 && spalte >= 0 && zeile < n && spalte < n){
if (spalte == n-1){
feld[index(zeile,spalte)]=i; // Daten evtl per Zeiger übergeben. Test von n=100 führte zu abbruch des Programms
eingabe(zeile+1, 0,i+1);
}
else
{
feld[index(zeile,spalte)]=i; // Daten evtl per Zeiger übergeben. Test von n=100 führte zu abbruch des Programms
eingabe(zeile, spalte+1,i+1);
}
}
}
void permutiere(int bla) { // Permutiere anz Elemente ab x
int i,merk;
if (bla == anzahl -1){ // Rekursionsabbruch
summDLR(0,0);
if(summD1 == magischeSumme){
summDRL(0,n-1);
if(summD2 == magischeSumme){
summZ(0,0);
if(zaehlerZ == n){
printf("%d\n",j); /*nur test später löschen*/
j++; /*nur test später löschen*/
summS(0,0);
if(zaehlerS == n){
printf("***Magic Square***\n\n");
ausgabe(0,0);
printf("\n");
exit(0);
}
zaehlerS=0;
}
zaehlerZ=0;
}
summD2=0;
}
summD1=0;
}
else{
for (i=bla; i<anzahl; i++) {
merk = feld[bla];
feld[bla] = feld[i];
feld[i] = merk;
/*printf("feldi:%d i:%d feldbla:%d bla:%d merk:%d \n",feld[i],i,feld[bla], bla, merk);*/ /*Zum Überprüfen Auskommentieren*/
permutiere(bla + 1); // Rekursion
feld[i] = feld[bla];
feld[bla] = merk;
}
}
}
void summZ(int zeile, int spalte) {
if (zeile >= 0 && spalte >= 0 && zeile < n && spalte < n){
if (spalte == n-1){
summZeile += feld[index(zeile,spalte)];
if(summZeile == magischeSumme){
/*printf("SummeZeile: %d\n",summZeile);*/ /*Zum Überprüfen Auskommentieren*/
summZeile=0;
zaehlerZ++;
summZ(zeile+1, 0);
}
else{
/*printf("SummeZeile: %d\n",summZeile);*/ /*Zum Überprüfen Auskommentieren*/
summZeile=0;
}
}
else
{
summZeile += feld[index(zeile,spalte)];
summZ(zeile, spalte+1);
}
}
}
void summS(int zeile, int spalte) {
if (zeile >= 0 && spalte >= 0 && zeile < n && spalte < n){
if (zeile == n-1){
summSpalte += feld[index(zeile,spalte)];
if(summSpalte == magischeSumme){
/*printf("SummeSpalte: %d\n",summSpalte);*/ /*Zum Überprüfen Auskommentieren*/
summSpalte=0;
zaehlerS++;
summS(0, spalte+1);
}
else{
/*printf("SummeSpalte: %d\n",summSpalte);*/ /*Zum Überprüfen Auskommentieren*/
summSpalte=0;
}
}
else
{
summSpalte += feld[index(zeile,spalte)];
/*printf("SummeSpalte: %d\n",summSpalte);*/ /*Zum Überprüfen Auskommentieren*/
/*printf("WertZeile: %d\n",zeile);*/ /*Zum Überprüfen Auskommentieren*/
summS(zeile+1, spalte);
}
}
}
void summDLR(int zeile, int spalte) {
if (zeile >= 0 && spalte >= 0 && zeile < n && spalte < n){
summD1 += feld[index(zeile,spalte)];
summDLR(zeile+1, spalte+1);
}
}
void summDRL(int zeile, int spalte) {
if (zeile >= 0 && spalte >= 0 && zeile < n && spalte < n){
summD2 += feld[index(zeile,spalte)];
summDRL(zeile+1, spalte-1);
}
}
void ausgabe(int zeile, int spalte) {
if (zeile >= 0 && spalte >= 0 && zeile < n && spalte < n){
if (spalte == n-1){
printf("%d \n",feld[index(zeile,spalte)]);
ausgabe(zeile+1, 0);
}
else
{
printf("%d ",feld[index(zeile,spalte)]);
ausgabe(zeile, spalte+1);
}
}
}
int main() {
scanf("%d",&n);
printf("\n");
anzahl=n*n;
magischeSumme=(n*n*n+n)/2;
/*printf("magischeSumme: %d \n",magischeSumme);*/ /*Zum Überprüfen Auskommentieren*/
feld = (int *) malloc(n*anzahl*sizeof(int));
if (feld == NULL) {
fprintf(stderr,"Malloc-Error!\n");
return 1;
}
eingabe(0,0,1);
permutiere(0);
getchar();
return 0;
}