2018福州大学上机(一):螺旋矩阵

任何疑问、意见、建议请留言公众号:一航代码

题目描述:

打印出如下图所示的螺旋矩阵:当 n = 4 时:

1

2

3

4

12

13

14

5

11

16

15

6

10

9

8

7

    要求:打印出螺旋矩阵,求第 i 行 j 列的数字,0<n<10000。

输入格式:

    输入螺旋矩阵的阶数 n ,0<n<10000。

输出格式:

    输出螺旋矩阵,矩阵中的每个数字的数据宽度为5,用空格隔开,每行数据末尾不存在空格。

输入样例:

4

输出样例:

    1    2    3    4
   12   13   14    5
   11   16   15    6
   10    9    8    7

解决方法:

+---------------->X轴

|    1    2    3    4

|  12  13  14    5

|  11  16  15    6

|  10    9    8    7

Y轴

设元素1的坐标为(0,0),元素13的坐标为(1,1),……,任一元素的坐标为(x,y),亦可以采用递归的方式,借助于一个二维数组,从外圈开始,向内圈打印输出。

(1)代码实现:

#include <bits/stdc++.h>
#define MAX_SIZE 10000
using namespace std;

int spiral[MAX_SIZE][MAX_SIZE];

void print_spiral(int x, int y, int num, int n)
{
    if (n <= 0)
    {
        return;
    }
    if (n == 1)
    {
        spiral[x][y] = num;
        return;
    }
    for (int i = x; i < x + n - 1; i++)     //向右遍历
    {
        spiral[y][i] = num++;
    }
    for (int i = y; i < y + n - 1; i++)     //向下遍历
    {
        spiral[i][y + n - 1] = num++;
    }
    for (int i = x + n - 1; i > x; i--)     //向左遍历
    {
        spiral[y + n - 1][i] = num++;
    }
    for (int i = y + n - 1; i > y; i--)     //向上遍历
    {
        spiral[i][x] = num++;
    }

    print_spiral(x + 1, y + 1, num, n - 2);    //递归下一层
}

int main()
{
    fill(spiral[0], spiral[0] + MAX_SIZE * MAX_SIZE, -1);
    int n;
    cin >> n;
    print_spiral(0, 0, 1, n);

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            printf("%5d", spiral[i][j]);
        }
        cout << endl;
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值