在论坛上看到有人提出这么一个问题,输入数字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;
}
}
具体算法思想,会在接下来有空的时候详细解析。