Advertisement
Guest User

Untitled

a guest
Dec 11th, 2019
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.16 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. int funkcija(int** polje, int m){
  5.     if(ponavljanjeBrojeva(polje, m) == 0)
  6.         return 0;
  7.    
  8.     int ukupniZbroj = 0;
  9.     for(int i = 1; i <= m * m; i++)
  10.         ukupniZbroj += i;
  11.     int zbroj = ukupniZbroj / m;
  12.    
  13.     for(int i = 0; i < m; i++){
  14.         for(int j = 0; j < m; j++){
  15.             if(polje[i][j] == 0){
  16.                 polje[i][j] = provjeri(polje, i, j, m, zbroj);
  17.             }
  18.         }
  19.     }
  20.    
  21.     if(ponavljanjeBrojeva(polje, m) == 0)
  22.         return 0;
  23.    
  24.     return 1;
  25. }
  26.  
  27. int ponavljanjeBrojeva(int** polje, int m){
  28.     for(int i = 1; i <= m * m; i++){
  29.         int brojac = 0;
  30.         for(int j = 0; j < m; j++){
  31.             for(int k = 0; k < m; k++){
  32.                 if(polje[j][k] == i)
  33.                     brojac++;
  34.                 if(polje[j][k] > m * m)
  35.                     return 0;
  36.             }
  37.         }
  38.         if(brojac > 1)
  39.             return 0;
  40.     }  
  41.     return 1;
  42. }
  43.  
  44. int provjeri(int **polje, int k, int z, int m, int zbroj){
  45.    
  46.     for(int i = 1; i <= m * m; i++){
  47.         if(i + zbrojRed(polje, m, k) == zbroj && i + zbrojStupac(polje, m, z) == zbroj){
  48.             if(k == z){
  49.                 if(zbrojDesnaDijagonala(polje, m) + i == zbroj && zbrojLijevaDijagonala(polje, m) + i == zbroj){
  50.                     return i;
  51.                 }
  52.             } else{
  53.                 return i;
  54.             }
  55.         }
  56.     }
  57.    
  58. }
  59.  
  60. int zbrojRed(int **polje, int m, int red){
  61.     int zbroj = 0;
  62.     for(int j = 0; j < m; j++){
  63.         zbroj += polje[red][j];
  64.     }
  65.     return zbroj;
  66. }
  67.  
  68. int zbrojStupac(int **polje, int m, int stupac){
  69.     int zbroj = 0;
  70.     for(int i = 0; i < m; i++){
  71.         zbroj += polje[i][stupac];
  72.     }
  73.     return zbroj;
  74. }
  75.  
  76. int zbrojLijevaDijagonala(int **polje, int m){
  77.     int zbroj = 0;
  78.     for(int i = 0; i < m; i++){
  79.         zbroj += polje[i][i];
  80.     }
  81.     return zbroj;
  82. }
  83.  
  84. int zbrojDesnaDijagonala(int **polje, int m){
  85.     int zbroj = 0;
  86.     for(int i = m - 1; i >= 0; i--){
  87.         zbroj += polje[i][i];
  88.     }
  89.     return zbroj;
  90. }
  91.  
  92. int main(void){
  93.     int m;
  94.     scanf("%d", &m);
  95.    
  96.     int **polje = (int**)calloc(m, sizeof(int*));
  97.     for(int i = 0; i < m; i++){
  98.         polje[i] = (int*)calloc(m, sizeof(int));
  99.         for(int j = 0; j < m; j++)
  100.             scanf("%d", &polje[i][j]);
  101.     }
  102.    
  103.     if(funkcija(polje, m) == 0){
  104.         printf("Ovo nije magicni kvadrat.");
  105.         return 0;
  106.     }
  107.    
  108.     for(int i = 0; i < m; i++){
  109.         for(int j = 0; j < m; j++){
  110.             printf("%3d", polje[i][j]);
  111.         }
  112.         printf("\n");
  113.     }
  114.    
  115.     return 0;
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement