所以我必须递归填充方阵。对于大小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)来跳过一个列和一行,同时递增值。
答案 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即可。
因此,总之,您的代码应该非常简单:
遍历所有x和y坐标。
根据上述公式设置相应单元格的值。
您的代码似乎不必要地复杂化了。所有递归都是完全不需要的。这可以通过在整个矩阵上单次通过,从上到下,从左到右来完成。您不需要知道相邻单元格的值,就可以计算下一个单元格中的值。