Застрял в двухмерной логике - PullRequest
1 голос
/ 21 июня 2011

Привет, я написал программу для наименьшей общей проблемы подпоследовательности,

и застрял с передачей и обходом 2-мерного массива. любезно помогать.

Ниже приведен фрагмент кода.

void backtrack(char x[], char y[], int L[][7], int m, int n)
{
  if(m == 0 || n == 0)
    return;

  else if(x[m-1] == y[n-1])
  {
    backtrack(x, y, L, m-1, n-1);
    cout << x[m-1] << " ";
  }

  else
  {
    if(L[m-1][n] > L[m][n-1])
      backtrack(x, y, L, m-1, n);
    else
      backtrack(x, y, L, m, n-1);
  }
}


int lcs_length(char x[], char y[], const int m, const int n)
{
  int L[m+1][n+1];

  for(int i=0; i<=m; i++)
  {     
    for(int j=0; j<=n; j++)
    {           
      if(i == 0 || j == 0)
        L[i][j] = 0;            

      else if (x[i-1] == y[j-1])
        L[i][j] = L[i-1][j-1] + 1;

      else              
        L[i][j] = max (L[i-1][j], L[i][j-1]); 
    }           
  }     
  backtrack(x, y, L, m+1, n+1);
  return L[m][n];
}



int main(int argc, char *argv[])
{
  char x[] =  "ABCDGH";
  char y[] =  "AEDFHR";

  int m = sizeof x / sizeof *x;
  int n = sizeof y / sizeof *y;

  cout << lcs_length(x, y, m, n);

  return EXIT_SUCCESS;
}

Я в основном застрял в вызове функции возврата из lcs_length (), так как не могу передать / пересечь 2-мерный массив внутри возврата ...

любезно помогите ..

спасибо.

1 Ответ

1 голос
/ 21 июня 2011

Ваш двумерный массив L в lcs_length не является реальным c-массивом, потому что вы используете переменные для установки количества элементов.При установке его размера, например, int L[100][7] все работает нормально.

Но для решения вашей проблемы я бы предпочел использовать реальный динамический массив, например:

int **L = new int* [m+1];
for (int i = 0; i < m+1; i++)
   L[i] = new int[n+1];

Тогда вы можете передатьмассив как int ** L.

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