序列螺旋矩阵

Problem Description

bLue 有一个长度为 n*n 的序列,现在他想把这个序列填到一个 n*n 的螺旋矩阵中,你能帮助他吗?

Input

输入数据有多组(数据组数不超过 20),到 EOF 结束。

对于每组数据:

  • 第 1 行输入 1 个奇数 n (1 <= n <= 9, n%2 = 1)
  • 第 2 行输入 n*n 个用空格隔开的整数(范围 [0, 100]),表示初始序列

Output

对于每组数据,输出一个 n*n 的矩阵,同一行内相邻整数之间用一个 '\t' 隔开。每组数据结尾额外输出一行空行。

Sample Input

3
1 2 3 4 5 6 7 8 9
5
5 3 2 4 8 7 1 6 9 10 11 12 13 14 15 16 17 18 19 20 21 25 27 29 33

Sample Output

7	8	9
6	1	2
5	4	3

21	25	27	29	33
20	1	6	9	10
19	7	5	3	11
18	8	4	2	12
17	16	15	14	13
思路:可以用递归填数,每层递归跑一圈,控制好方向和边界即可, 仔细观察示例,填螺旋矩阵时,初始位置为矩阵中心,按照向右、向下、向左、向上的顺序,把序列中的数从内到外一圈一圈填入矩阵中即可。代码如下:
#include <stdio.h>

int n, b[9][9], a[81], cnt;

void Fill(int x, int y)
{
    if(x>=0 && x<n && y>=0 && y<n)
        b[x][y] = a[cnt++];
}

void f(int l, int r, int u, int d)
{
    if(l >= -1)
    {
        for(int i=l+1; i<=r; ++i)
        {
            Fill(u, i);//右;
        }
        for(int i=u+1; i<=d; ++i)
        {
            Fill(i, r);//下;
        }
        for(int i=r-1; i>=l; --i)
        {
            Fill(d, i);//左;
        }
        for(int i=d-1; i>=u; --i)
        {
            Fill(i, l);//上;
        }
        f(l-1, r+1, u-1, d+1);
    }
}

int main()
{
    while(~ scanf("%d", &n))
    {
        for(int i=0; i<n*n; ++i)
        {
            scanf("%d", &a[i]);
        }
        cnt = 0;
        f(n/2-1, n/2+1, n/2, n/2+1);
        for(int i=0; i<n; ++i)
        {
            for(int j=0; j<n; ++j)
            {
                if(j) printf("\t");
                printf("%d", b[i][j]);
            }
            printf("\n");
        }
        printf("\n");
    }

    return 0;
}


/***************************************************
User name: Saberking
Result: Accepted
Take time: 0ms
Take Memory: 148KB
Submit time: 2018-06-06 16:49:23
****************************************************/

猜你喜欢

转载自blog.csdn.net/z_xindong/article/details/80597393