求同心矩阵

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

3的同心矩阵形式如下:

1
2
3
4
5
6
7
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。
下面的两个函数其实是一样的,前一个是固定好数组大小,后一个是动态分配。代码仅供参考。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// 固定数组方式,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编写,手工生成。