Sulla scia dell'esercizio sul quadrato magico ho tirato giù questa soluzione
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#define DIM 3
void generazione_p(int matp[][DIM]);
void inizializza_p(int matp[][DIM]);
void inizializza_G(int matG[][DIM*DIM]);
void stampa_P(int matp[][DIM]);
void stampa_G(int matG[][DIM*DIM]);
int confronto(int num,int matp[][DIM]);
void genera_G(int matp[][DIM],int matG[][DIM*DIM],int ,int );
int verifica(int matG[][DIM*DIM]);
int main(){
srand(time(NULL));
int matG2[][DIM*DIM] = { {5,3,4,6,7,8,9,1,2},{6,7,2,1,9,5,3,4,8},{1,9,8,3,4,2,5,6,7},{8,5,9,7,6,1,4,2,3},{4,2,6,8,5,3,7,9,1},{7,1,3,9,2,4,8,5,6},{9,6,1,5,3,7,2,8,4},{2,8,7,4,1,9,6,3,5},{3,4,5,2,8,6,1,7,9}};
int matp[DIM][DIM];
int i,j,flag = 0;
int matG[DIM*DIM][DIM*DIM];
inizializza_p(matp);
inizializza_G(matG);
while(flag==0){
for(j=0; j<DIM; j++)
for(i=0; i<DIM; i++){ //genera matrice 9*9
generazione_p(matp);
genera_G(matp,matG,i,j);
}
if(verifica(matG)==1){
stampa_G(matG);
flag = 1;
}
else
inizializza_G(matG);
//printf("%d",verifica(matG2));
}
}
void genera_G(int matp[][DIM],int matG[][DIM*DIM],int i,int j){
int m,n,cont,cont2;
for(m=i*DIM,cont=0; cont<DIM; cont++,m++)
for(n=j*DIM,cont2=0; cont2<DIM; cont2++,n++)
matG[m][n] = matp[cont][cont2];
}
void generazione_p(int matp[][DIM]){
int num,i,j;
inizializza_p(matp);
for(i=0; i<DIM; i++)
for(j=0; j<DIM; j++){
num = rand() % (DIM*DIM) + 1;
while(confronto(num,matp)==1)
num = rand() % (DIM*DIM) + 1;
matp[i][j] = num;
}
}
void inizializza_p(int matp[][DIM]){
int i,j;
for(i=0; i<DIM; i++)
for(j=0; j<DIM; j++)
matp[i][j]=0;
}
void inizializza_G(int matG[][DIM*DIM]){
int i,j;
for(i=0; i<DIM*DIM; i++)
for(j=0; j<DIM*DIM; j++)
matG[i][j]=0;
}
void stampa_P(int matp[][DIM]){
int i,j;
for(i=0; i<DIM; i++){
for(j=0; j<DIM; j++)
printf("%d ",matp[i][j]);
printf("\n");
}
}
void stampa_G(int matG[][DIM*DIM]){
int i,j;
for(i=0; i<DIM*DIM; i++){
for(j=0; j<DIM*DIM; j++)
printf("%d ",matG[i][j]);
printf("\n");
}
}
int confronto(int num,int mat[][DIM]){
int i,j;
for(i=0; i<DIM; i++){
for(j=0; j<DIM; j++)
if(num == mat[i][j])
return 1;
}
return 0;
}
int verifica(int matG[][DIM*DIM]){
int somma1=0,i,j,somma2;
for(i=0,j=0; i<DIM*DIM; i++) //valore check
somma1 = somma1 + matG[j][i];
for(i=0; i<DIM*DIM; i++){ //confronto righe con somma
for(j=0,somma2=0; j<DIM*DIM; j++)
somma2=somma2+matG[i][j];
if(somma2!=somma1)
return 0;
}
for(i=0; i<DIM*DIM; i++){ //confronto colonne con somma
for(j=0,somma2=0; j<DIM*DIM; j++)
somma2=somma2+matG[j][i];
if(somma2!=somma1)
return 0;
}
return 1;
}
Ho usato matG2 per assicurarmi che la funzione verifica funzioni, non sono certo che costruisca le matrici 9x9 in modo corretto ma avevo fatto delle prove e dovrebbe funzionare. Ammesso che funzioni purtroppo non trova soluzioni in tempi utili