Advertisement
juanjo12x

Magic_Square_Generator

Mar 31st, 2014
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.48 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. #define N 4
  4. #define SUMA  ((N*(N*N+1))/2)
  5.  
  6. int cont =0;
  7. /*
  8. int correcto(int cuadrado[][N]){
  9. int i,j;
  10. int columna, fila, diagonal;
  11.  
  12.     //revisar columnas
  13.     for(i=0;i<N;i++){
  14.         columna=0;
  15.         for(j=0;j<N;j++) columna+= cuadrado[i][j];
  16.         if (columna != SUMA) return 0;
  17.     }
  18.  
  19.     //revisar filas
  20.     for(j=0;j<N;j++){
  21.         fila=0;
  22.         for(i=0;i<N;i++) fila+= cuadrado[i][j];
  23.         if (fila != SUMA) return 0;
  24.     }
  25.  
  26.     // diagonal principal
  27.     diagonal=0;
  28.     for(i=0;i<N;i++) diagonal+= cuadrado[i][i];
  29.     if (diagonal!= SUMA) return 0;
  30.     //diagonal secundaria
  31.     diagonal=0;
  32.     for(i=0;i<N;i++) diagonal+= cuadrado[i][N-i-1];
  33.     if (diagonal!= SUMA) return 0;
  34.  
  35.     return 1;
  36. }
  37.  
  38. */
  39.  
  40. void print(int cuadrado[][N]){
  41.     int i,j;
  42.     for(i=0;i<N;i++){
  43.         for(j=0;j<N;j++) printf("%3d",cuadrado[i][j]);
  44.         printf("\n");
  45.     }
  46.     printf("\n");
  47.  
  48. return ;
  49. }
  50.  
  51. int completar(int check[], int cuadrado[][N]){
  52.     int i,j,k;
  53.     int modificados[N*N+1];
  54.  
  55.     for(i=1;i<=N*N;i++) modificados[i]=check[i];
  56.  
  57.     int diagonal;
  58.     int ultimo;
  59.  
  60.     for(j=0;j<N;j++){
  61.  
  62.         ultimo=SUMA;
  63.         for(k=0; k<N-1;k++){
  64.             ultimo= ultimo-cuadrado[k][j];
  65.         }
  66.  
  67.         if (ultimo>0 && ultimo<=N*N && !modificados[ultimo]){
  68.             modificados[ultimo]=1;
  69.             cuadrado[N-1][j]=ultimo;       
  70.         }
  71.         else    return 0;
  72.  
  73.     }  
  74.    
  75.    
  76.  
  77.     // diagonal principal
  78.     diagonal=0;
  79.     for(i=0;i<N;i++) diagonal+= cuadrado[i][i];
  80.     if (diagonal!= SUMA) return 0;
  81.     //diagonal secundaria
  82.     diagonal=0;
  83.     for(i=0;i<N;i++) diagonal+= cuadrado[i][N-i-1];
  84.     if (diagonal!= SUMA) return 0;
  85.    
  86.     return 1;
  87. }
  88.  
  89.  
  90.  
  91. void backtrack( int i, int j, int check[], int cuadrado[][N]){
  92.     int k;
  93.     int ultimo;
  94.    
  95.     if (i==N-1) {if (completar(check, cuadrado)){ print(cuadrado); cont++; } }
  96.  
  97.     else if (j==N-1){
  98.  
  99.         ultimo=SUMA;
  100.         for(k=0;k<j;k++) ultimo=ultimo-cuadrado[i][k];
  101.         //printf("Deberiamos asignar %d a %d %d\n",ultimo,i,j);
  102.         if (ultimo>0 && ultimo<=N*N && !check[ultimo]){
  103.             check[ultimo]=1;
  104.             cuadrado[i][j]= ultimo;
  105.             //printf("Asignamos %d a %d %d\n", ultimo, i,j);
  106.             backtrack(i+1, 0, check, cuadrado);
  107.             check[ultimo]=0;
  108.         }
  109.     }
  110.  
  111.     else{
  112.         for(k=1;k<=N*N;k++) if (!check[k]){
  113.             check[k]=1;
  114.             cuadrado[i][j]=k;
  115.             //printf("Asignamos %d a %d %d\n", k, i,j);
  116.             backtrack(i,j+1,check, cuadrado);
  117.             check[k]=0;
  118.         }
  119.  
  120.     }
  121.     return ;
  122. }
  123.  
  124.  
  125. int main(){
  126.  
  127. int check[N*N+1];
  128. int cuadrado[N][N];
  129.  
  130. int i;
  131.  
  132. for(i=1;i<=N*N;i++) check[i]=0;
  133. //printf("%d\n",SUMA);
  134. backtrack(0,0,check, cuadrado);
  135. printf("El total de cuadrados magicos es %d\n",cont);
  136.  
  137. return 0;
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement