一道矩阵输出题


在论坛上看到有人提出这么一个问题,输入数字n,输出对应的矩阵。例如,

输入:1

输出:1

输入:2

输出:1     2

            4     3

输入3:

输出:7     8     9

            6     1     2

            5     4     3

要求:尽可能占用较少空间,时间复杂度尽量低,且对于n较大时(如:n=1000000000)仍然正确快速输出。

我的解答如下:

#include<iostream>

using namespace std;

#define max(x,y) ((x)>(y)?(x):(y))
#define abs(x) ((x>0)?(x):-(x))

int main() {
        long n;
        cin>>n;
        long x,y,m;
        for (y=(n+1)/2-1;y>=-n/2;y--) {
                for (x=-(n+1)/2+1;x<=n/2;x++) {
                        m = 2*max(abs(x),abs(y)) + 1;
                        if (x>y && x+y>=0) {
                                cout<<(m*m-3*m+3-(x+y))<<'\t';
                        } else if (y>=x && x+y>0) {
                                cout<<(m*m-(y-x))<<'\t';
                        } else if (x<y && x+y<=0) {
                                cout<<(m*m-m+1+(x+y))<<'\t';
                        } else if (y<=x && x+y<=0) {
                                cout<<(m*m-2*m+2-(x-y))<<'\t';
                        }

                }
                cout<<endl;
        }
}

具体算法思想,会在接下来有空的时候详细解析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值