当前位置: 首页 > 我的程序代码 > 正文

求同心矩阵

背景:

在CSDN论坛上看到的题目,写了出来。

3的同心矩阵形式如下:

3 3 3 3 3 3 3

3 2 2 2 2 2 3

3 2 1 1 1 2 3

3 2 1 0 1 2 3

3 2 1 1 1 2 3

3 2 2 2 2 2 3

3 3 3 3 3 3 3

这个矩阵从最中间的数(0)开始,依次被后一个数包围。矩阵的行数和列数相同,为2 * x + 1,其中x就是矩阵最外边的数。我不知道这个叫不叫同心矩阵,因为网络上资料比较少,暂且这样称呼吧。

算法也不难,先从外边的填充,一直到最中间的0。

下面的两个函数其实是一样的,前一个是固定好数组大小,后一个是动态分配。代码仅供参考。

// 固定数组方式,x范围:0~9

int concentric_matrix_1(int x)

{

int m = 2 * x + 1;

int i;

int j = 0;

int a[20][20];

// 初始化为0

for (i = 0; i < m; i++)

for (j = 0; j < m; j++)

a[i][j] = 0;        j = 0;

while (x > 0)

{

for (i = j; i < m – j; i++)

{

a[j][i] = x;

a[i][j] = x;

a[m -1 – j][i] = x;

a[i][m – 1 – j] = x;

}

j++;

x–;

}

// 输出

for (i = 0; i < m; i++)

{

for (j = 0; j < m; j++)

{

printf(“%d “, a[i][j]);

}

printf(“n”);

}

return 0;

}

// 同心矩形 动态分配数组方式

// x最好是0~9,不然输出格式不对齐

int concentric_matrix_2(int x)

{

int m = 2 * x + 1;

int i;

int j = 0;

int **a;

a = (int **)malloc(m * sizeof(int));        // 相当于只分配了a[i]

for (i = 0; i < m; i++)

a[i] = (int *)malloc(m * sizeof(int));  // 相当于分配a[i]后面的m个数

// 初始化为0

for (i = 0; i < m; i++)

for (j = 0; j < m; j++)

a[i][j] = 0;

j = 0;

while (x > 0)

{

for (i = j; i < m – j; i++)

{

a[j][i] = x;

a[i][j] = x;

a[m -1 – j][i] = x;

a[i][m – 1 – j] = x;

}

j++;

x–;

}

// 输出

for (i = 0; i < m; i++)

{

for (j = 0; j < m; j++)

{

printf(“%d “, a[i][j]);

}

printf(“n”);

}

for (i = 0; i < m; i++)

free(a[i]);

free(a);

return 0;

}

int main(void)

{

concentric_matrix_2(8);

return 0;

}

本文语法高亮工具由李迟参考他人资料基于lex编写,手工生成。

本文固定链接: http://www.latelee.org/my-library/concentric-matrix.html

如无特别说明,迟思堂工作室文章均为原创,转载请注明: 求同心矩阵 | 迟思堂工作室

目前暂无评论

发表评论

*

快捷键:Ctrl+Enter