2015-03-16 2 views
2

Так что я должен рекурсивно заполнить квадратную матрицу. Для размера N = 5, оно должно быть:Как заполнить матрицу рекурсивно в C++?

1 1 1 1 1 
    1 2 2 2 1 
    1 2 3 2 1 
    1 2 2 2 1 
    1 1 1 1 1 

но моя программа показывает:

1 1 1 1 1 
    1 2 2 2 1 
    1 2 3 3 1 
    1 2 2 2 1 
    1 1 1 1 1 

void llenar5 (int** mat, int n, int f=0, int c=0,int k=2) 
{ 
if (f<n) 
{ 
    if (c<n) 
    { 
     if (f==0 ||c==0||f==n-1||c==n-1) 
     { 
      *(*(mat+f)+c)=1; 
      llenar5(mat,n,f,c+1,k); //move to the right 
     } 
     else if (f==k-1 ||c==k-1||f==n-k||c==n-k) 
     { 
      *(*(mat+f)+c)=k; 
      llenar5(mat,n,f,c+1,k++); 
     } 
    } 
    llenar5(mat,n,f+1,c,k); 
} 

}

Я создаю матрицу в динамической памяти, и я попытался вызова функции llenar5 (mat, n, f + 1, c + 1, k + 1), чтобы перепрыгнуть столбец и строку при увеличении значений.

ответ

-1

Я думаю, что это поможет, если вы временно рассмотрите матрицу с номерами на основе 0. Например, ваша исходная матрица будет выглядеть вместо что-то вроде этого:

0 0 0 0 0 
0 1 1 1 0 
0 1 2 1 0 
0 1 1 1 0 
0 0 0 0 0 

Если вы проверяете эту матрицу, вы должны быстро наблюдать фундаментальное свойство этой матрицы. Значение каждой ячейки - это минимальное расстояние от ячейки до ее ближайшего горизонтального или вертикального края.

Таким образом, для ячейки в точке с координатами (х, у), с матрицей размера ш (ширина) и Н (высота), величина каждой ячейки:

min(x, y, (w-1-x), (h-1-y)) 

Где мин() функция - классическая минимальная функция, которая вычисляет минимальное значение своих аргументов.

Тогда должно быть очевидно, что переход от матрицы на основе 0 к матрице на основе 1 должен просто добавить 1 к результату.

Итак, в заключение код должен быть тривиальным просто:

  1. Цикл по всем х и у координат.

  2. Задайте значение соответствующей ячейки на основе приведенной выше формулы.

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

+1

Я понимаю, что вы пытаетесь сказать, но мой профессор хочет назвать нашу процедуру рекурсивно, а не использовать другую функцию в нем рекурсивно. – user3053042

0
void llenar5 (int** mat, int n, int f=0, int c=0,int k=1) 
{ 
if (f<n) 
{ 
    if (c<n) 
    { 
     if (f==k-1 ||c==k-1||f==n-k||c==n-k) 
     { 
      *(*(mat+f)+c)=k; 
      llenar5(mat,n,f,c+1,k+1); 
     } 
     llenar5(mat,n,f,c+1,k); 
    } 
    llenar5(mat,n,f+1,c,k); 
} 

}

+0

взял меня на два дня для второго рекурсивного вызова -_- – user3053042

Смежные вопросы