Инициализируйте два 2D-массива и заполните первый столбец и первый ряд одного из массивов 0 вместе с динамическим распределением памяти - PullRequest
0 голосов
/ 14 ноября 2018

Эта функция должна инициализировать массивы C [m + 1] [n + 1] и B [m] [n] и заполнить первую строку и первый столбец C нулями. Примечание: int *** C относится к указателю, указывающему на двумерный целочисленный массив. Пожалуйста, исправьте ошибку.

void initLCSTable(int*** C, char*** B, int m, int n)
{
C[m + 1][n + 1] = {{0}}; //i don't know if this makes the 1st row & column to 0
for (int row = 0; row < m; row++)
{
    for (int col = 0; col < n; col++)
    {
        C[m][n] = 0;
    }
B[m][n];
}
void printLengthTable(int** C, int m, int n);
void printArrowTable(char** B, int m, int n);

//The following function releases the memory space table C & B 
occupied
void freeLCSTable(int** C, char** B, int m)
{
// add code here. Please assist me in this function.
}


main {
int** C;
char** B;
initLCSTable(&C, &B, m, n);

cout << "\nTable C" << endl;
printLengthTable(C, m, n);

cout << "\nTable B" << endl;
printArrowTable(B, m, n);
return 0;
}


//This function print the 2D length array C
//Note: array C has m+1 rows and n+1 column
void printLengthTable(int** C, int m, int n)
{
    for (int i = 0; i <= m; i++)
    {
        for (int j = 0; j <= n; j++)
        {
            cout << C[i][j] << " ";
        }
        cout << endl;
    }
}

//******************************************
//This function print the 2D arrow array B
//Note: array B has m rows and n column
void printArrowTable(char** B, int m, int n)
{
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cout << B[i][j] << " ";
        }
        cout << endl;
    }
}

Вывод должен выглядеть следующим образом (игнорируйте ненулевые значения, так как это все другой вопрос о самой длинной подпоследовательности):

enter image description here

1 Ответ

0 голосов
/ 14 ноября 2018

Пока вы инициализируете часть массива, остальные будут инициализироваться по умолчанию.

C[m + 1][n + 1] = {{0}}; // Zero-initialized
C[m + 1][n + 1] = {0};   // Same ^
C[m + 1][n + 1] = {{1}}; // Zero-intialized except for [0][0] = 1
C[m + 1][n + 1] = {1};   // Same ^
C[m + 1][n + 1];         // Uninitialized!

В некоторых случаях массивы инициализируются нулями в любом случае, но это не мешает делатьтак явно.

Обратите внимание, что если вы хотите инициализировать со значениями, отличными от нуля, вам (в основном) не повезет.Недавно я поработал с шаблонным метапрограммированием, которое помогло бы ...

// You can subclass this type, add it as a member, etc.
template<class T, T... I> struct Seq {
    typedef T value_type [sizeof...(I)];
    // If you want to use it directly from here:
    static constexpr value_type value = {I...};
    // Don't bother trying with any variation of...
    // static constexpr value_type to_array(void) { return {I...}; }
};
template<class T, T... I0, T... I1>
auto operator+(Seq<T, I0...> const&, Seq<T, I1...> const&)
    -> Seq<T, I0+I1...> { return {}; }
template<class T, T... I0, T... I1>
auto operator<<(Seq<T, I0...> const&, Seq<T, I1...> const&)
    -> Seq<T, I0..., I1...> { return {}; }
// ... more Seq manipulation ...

. Я могу использовать это для определения диапазонов чисел, биномиальных коэффициентов и т. Д., Пока у меня все еще есть доступк аргументам шаблона, я могу сделать массив из этого.(Это включает в себя перемещение Seq<...> в виде абстрактного T до функции, в которой оно используется.) Я хотел бы знать, что еще можно сделать с этим.Я попытался вернуть initializer_list и определить из этого массив, но безуспешно (инициализаторы массива выглядят только как initializer_list с.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...