如何在c ++中递归填充矩阵?

时间:2015-03-16 02:02:40

标签: c++ matrix

所以我必须递归填充方阵。对于大小N = 5,它应该是:

  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)来跳过一个列和一行,同时递增值。

2 个答案:

答案 0 :(得分: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);
}

}

答案 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

如果检查此矩阵,则应快速观察此矩阵的基本属性。每个单元格的值是从单元格到最近的水平或垂直边缘的最小距离。

因此,对于坐标(x,y)处的单元格,使用大小为w(宽度)和h(高度)的矩阵,每个单元格的值为:

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

min()函数是经典的最小函数,它计算其参数的最小值。

然后,显而易见的是,从基于0的矩阵到基于1的矩阵,您只需在结果中加1即可。

因此,总之,您的代码应该非常简单:

  1. 遍历所有x和y坐标。

  2. 根据上述公式设置相应单元格的值。

  3. 您的代码似乎不必要地复杂化了。所有递归都是完全不需要的。这可以通过在整个矩阵上单次通过,从上到下,从左到右来完成。您不需要知道相邻单元格的值,就可以计算下一个单元格中的值。