题目是:
打印N*N螺旋矩阵,如N=5时,
打印以下字符串结果:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
以前都是模拟打印的,前几天网上又有人问起,就试着推了推:
大概思路是这样子的,取得每一层的左上角和右下角的两个位置,取得前一层的最大值(其实就是本层的右上角数据-1),记做addr,
计算本层的每个数据离左上角数据的差距,左上角的数据到自身的差距记为1,记做len.
经过计算可得出以下结论:
当i<=j时,a[i][j]=addr+len;
addr==4*(n-minp+1)*(minp-1)
len=i+j-2minp+1
a[i][j]=addr+len=4*(n-minp+1)*(minp-1)+(i+j-2minp+1);
当i>j时,a[i][j]=addr+len;
addr==4*(n-minp+1)*(minp-1)
len=2(maxp-minp)+2maxp-(i+j)+1=4maxp-2minp-i-j+1;
a[i][j]=addr+len=4*(n-minp+1)*(minp-1)+(4maxp-2minp-i-j+1);
关于minp和maxp:
当i+j<=n+1时,
minp=min(i,j); maxp=n+1-min(i,j)
当i+j>n+1时,
minp=n+1-max(i,j); maxp=max(i,j)
(也可以将i+j>n+1转化到i+j<=n+1上求解:
minp=min(n+1-i),(n+1-j)=n+1+min(-i,-j)=n+1-max(i,j);)
addr其实就是一个等差数列的和:
addr=4(n-1)+4(n-3)+4(n-5)+……+4(n-(2min-3))
=4((n-1)+(n-3)+……+(n-(2min-3)))
=4*((n-1+(n-(2min-3)))*(min-1))/2
=2*(2n-1-2min+3)*(min-1)
=2*(2n-2min+2)(min-1)
=4*(n-min+1)*(min-1)
END.