Массив заполняется мусором

Я работаю над самой длинной распространенной программой подпоследовательностей, и по какой-то причине мой массив продолжает заполняться мусором даже после того, как я инициализирую все, что внутри него, в NULL.

    #include "main.h"
int main()
{
//Provided char arrays containing sequences
char X[] = { ' ', 's', 'k', 'u', 'l', 'l', 'a', 'n', 'd', 'c', 'r', 'o', 's', 's', 'b', 'o', 'n', 'e', 's' };
char Y[] = { ' ', 'l', 'u', 'l', 'l', 'a', 'b', 'i', 'e', 's', 'f', 'o', 'r', 'b', 'a', 'b', 'i', 'e', 's' };

//Char array that will contain the directions
//for the longest subsequence
char b[ARRAY_ROW][ARRAY_COL];

int c[ARRAY_ROW][ARRAY_COL];

//Envoking LCS function
LongestCommonSubsequence(X, Y, b, c);

int row = ARRAY_ROW;
int col = ARRAY_COL;

//Envoking traverse function
Traverse(b, X, row, col);

cout << "END PHASE" << endl;

return 0;
}

void LongestCommonSubsequence(char x[], char y[], char b[ARRAY_ROW][ARRAY_COL], int c[ARRAY_ROW][ARRAY_COL])
{
//hardcoded length look back here
int m = ARRAY_ROW - 1;
int n = ARRAY_COL - 1;

for (int i = 0; i <= m; i++)
{
for (int j = 0; j <= n; j++)
{
c[i][j] = 0;
b[i][j] = 0;
}
}

for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
if (x[i] == y[j])
{
c[i][j] = c[i - 1][j - 1] + 1;
b[i][j] = '\\';
}
else if (c[i - 1][j] >= c[i][j - 1])
{
c[i][j] = c[i - 1][j];
b[i][j] = '|';
}
else
{
c[i][j] = c[i][j - 1];
b[i][j] = '-';
}
}
}

return;
}

void Traverse(char b[][ARRAY_COL], char x[], int i, int j)
{

if (i == 0 || j == 0)
return;
if (b[i][j] == '\\')
{
Traverse(b, x, i - 1, j - 1);
cout << x[i];
}
else if (b[i][j] == '|')
{
Traverse(b, x, i - 1, j);
}
else
{
Traverse(b, x, i, j - 1);
}
return;
}

в моей функции LongestCommonSubsequence первое, что я делаю, это инициализирую 2D-массив в NULL с жестко закодированными размерами. Однако после инициализации массива он все еще заполнен мусором. Поэтому, когда я нажимаю на свою функцию Traverse, ни одно из операторов if не срабатывает, потому что оно никогда не равняется этим символам.

0

Решение

Я нашел решение! Когда я вызывал функцию Traverse

int row = ARRAY_ROW;
int col = ARRAY_COL;

//Envoking traverse function
Traverse(b, X, row, col);

Я проходил в 19 и 19 для последних двух аргументов. Тогда в моей функции Траверс

void Traverse(char b[][ARRAY_COL], char x[], int i, int j)
{
if (i == 0 || j == 0)
return;
if (b[i][j] == '\\')
{
Traverse(b, x, i - 1, j - 1);
cout << x[i];
}
else if (b[i][j] == '|')
{
Traverse(b, x, i - 1, j);
}
else
{
Traverse(b, x, i, j - 1);
}
return;
}

Мы пытались начать с чтения b [19] [19], которого не существует, потому что наш массив только идет b [0-18] [0-18].

Затем мы исправили это, добавив

int row = ARRAY_ROW - 1;
int col = ARRAY_COL - 1;

//Envoking traverse function
Traverse(b, X, row, col);

и теперь мы можем найти самую длинную общую подпоследовательность.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]