求同心矩阵 | 迟思堂工作室
A-A+

求同心矩阵

2014-08-30 19:24 我的程序代码 暂无评论 阅读 307 次

背景:

在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编写,手工生成。



如果本文对阁下有帮助,不妨赞助笔者以输出更多好文章,谢谢!
donate



标签:

给我留言