diff --git a/ex1/ex1.c b/ex1/ex1.c
index a24c2804046dd904d3c5224bd0a2e61dc3b12408..dd8f9ac08f5239d83c5559677f242d2bcd7ce7bc 100644
--- a/ex1/ex1.c
+++ b/ex1/ex1.c
@@ -16,30 +16,75 @@
 #include <stdlib.h>
 #include <string.h>
 
+double **matrix_init(int m, int n) {
+    double **matrix = (double **)malloc(sizeof(double *) * m);
+
+    for (int i = 0; i < m; i += 1) {
+        matrix[i] = (double *)malloc(sizeof(double) * n);
+
+        for (int j = 0; j < n; j += 1) {
+            matrix[i][j] = sqrt(i + j);
+        }
+    }
+
+    return matrix;
+}
+
+void matrix_destroy(double **matrix, int m) {
+    for (int i = 0; i < m; i += 1) {
+        free(matrix[i]);
+    }
+
+    free(matrix);
+}
+
+void matrix_print(double **matrix, int m, int n) {
+    for (int i = 0; i < m; i += 1) {
+        for (int j = 0; j < n; j += 1) {
+            printf("%lf ", matrix[i][j]);
+        }
+
+        printf("\n");
+    }
+}
+
+double **matrix_average(double **matrix, int m, int n) {
+    double **output = matrix_init(m, n);
+
+    for (int i = 0; i < m; i += 1) {
+        for (int j = 0; j < n; j += 1) {
+            double value = 0;
+
+            if (i >= 1 && i <= m - 2 && j >= 1 && j <= n - 2) {
+                value += matrix[i][j];
+                value += matrix[i + 1][j];
+                value += matrix[i - 1][j];
+                value += matrix[i][j + 1];
+                value += matrix[i][j - 1];
+                value /= 5;                
+            } else {
+                value = matrix[i][j];
+            }
+
+            output[i][j] = value;
+        }
+    }
+
+    return output;
+}
+
 int main() {
-    // int32_t values_length = 5;
-    // double values[values_length];
-
-    // for (int32_t i = 0; i < values_length; i += 1) {
-    //     double value;
-    //     scanf("%lf", &value);
-    //     values[i] = value;
-    // }
-
-    // int32_t values_length = 5;
-    // int32_t values[values_length];
-
-    // for (int32_t i = 0; i < values_length; i += 1) {
-    //     int32_t value;
-    //     scanf("%d", &value);
-    //     values[i] = value;
-    // }
-
-    // char a[100];
-    // int32_t b;
-    // scanf("%s %d", a, &b);
-    // printf("%s %d\n", a, b);
-
-    printf("ex1\n");
+    int m = 5;
+    int n = 4;
+    double **M = matrix_init(m, n);    
+
+    for (int i = 0; i < 10; i += 1) {
+        double **N = matrix_average(M, m, n);
+        matrix_destroy(M, m);
+        M = N;
+    }
+
+    matrix_print(M, m, n);
+    matrix_destroy(M, m);
     return EXIT_SUCCESS;
 }