• + 1 comment
    void printf_matrix(int s_rows, int s_columns, int** s){
        for (int i = 0; i<s_rows; i++){
            for (int j = 0; j<s_columns; j++){
                printf("%d ", s[i][j]);
            }
            printf("\n");
        }
    }
    
    int compute_cost(int s_rows, int s_columns, int** s, int** s_){
        int res = 0;
        for (int i = 0; i<s_rows; i++){
            for (int j = 0; j<s_columns; j++){
                res += abs(s[i][j] - s_[i][j]);            
            }
        }
        return res;
    }
    
    int formingMagicSquare(int s_rows, int s_columns, int** s) {
        // All 8 possible 3x3 magic squares
        int magic_squares[8][3][3] = {
            {{8, 3, 4}, {1, 5, 9}, {6, 7, 2}},
            {{4, 3, 8}, {9, 5, 1}, {2, 7, 6}},
            {{4, 9, 2}, {3, 5, 7}, {8, 1, 6}},
            {{2, 9, 4}, {7, 5, 3}, {6, 1, 8}},
            {{2, 7, 6}, {9, 5, 1}, {4, 3, 8}},
            {{6, 7, 2}, {1, 5, 9}, {8, 3, 4}},
            {{6, 1, 8}, {7, 5, 3}, {2, 9, 4}},
            {{8, 1, 6}, {3, 5, 7}, {4, 9, 2}}
        };
    
        int min_cost = -1;
        int** best_matrix = NULL;
    
        // Compare input matrix against all 8 magic squares
        for (int k = 0; k < 8; k++) {
            int* magic_1D_pointer[3] = {magic_squares[k][0], magic_squares[k][1], magic_squares[k][2]};
            int** magic_ptr = magic_1D_pointer;
            int cost = compute_cost(s_rows, s_columns, s, magic_ptr);
            if (min_cost == -1 || cost < min_cost) {
                min_cost = cost;
                best_matrix = magic_ptr; // Points to static memory, no need to free
            }
        }
    
        printf_matrix(s_rows, s_columns, best_matrix);
        return min_cost;
    }