背景:
在CSDN论坛上看到的题目,写了出来。
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。
下面的两个函数其实是一样的,前一个是固定好数组大小,后一个是动态分配。代码仅供参考。
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编写,手工生成。