现在的位置: 首页 > 综合 > 正文

求同心矩阵

2013年03月10日 ⁄ 综合 ⁄ 共 2201字 ⁄ 字号 评论关闭

背景:

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

【上篇】
【下篇】

抱歉!评论已关闭.