O(1)计算螺旋矩阵对应位置的元素

螺旋矩阵

螺旋矩阵是指一个呈螺旋状的矩阵,它的数字由右上角开始向下依次填充,到边界之后继续向左边填充吗,然后依次是上边和右边。如此循环。图例如下:
螺旋矩阵
我们规定左下角的坐标是 ( 1 , 1 ) (1,1) (1,1),右上角的坐标是 ( n , n ) (n,n) (n,n) ( x , y ) (x,y) (x,y)代表位于从左往后数第x列,从下往上数第y行的元素。

计算方法

螺旋矩阵具有很强的规律性,因为元素是一圈一圈填充进去的,所以,我们可以先计算出来所求位置元素位于第几圈(从外向内数,第一圈的边长是 n n n,第二圈的边长是 n − 2 n-2 n2,以此类推…)上(假设是 T T T),然后先计算出前 T − 1 T-1 T1圈的总的数字数量,然后再计算出第T圈中小于等于所求位置数字的数字数量,就可以得到对应位置的值了。具体情况如下:
首先 T T T圈的边长为 n − 2 ( T − 1 ) = n + 2 T + 2 n-2(T-1) = n+2T+2 n2(T1)=n+2T+2,当前点 ( x , y ) (x,y) (x,y)位于从下往上数第 y y y行,从上往下数第 n − y + 1 n-y+1 ny+1行,从左往右数第 x x x列,从右往左数第 n − x + 1 n-x+1 nx+1列。每一圈的数字可以看作由四个长度为 当 前 边 长 − 1 当前边长-1 1的数字段组成。那么,我们可得 ( x , y ) (x,y) (x,y)位置的数字的值(即 v a l ( x , y ) val(x,y) val(x,y))为:
首先,设该元素所在的圈为第 T T T圈,可得 T = m i n ( n − x + 1 , n − y + 1 , x , y ) T = min(n-x+1,n-y+1,x,y) T=min(nx+1,ny+1,x,y)。那么,前 m m m圈的数字个数为:
4 ∗ m ∗ ( ( n − 1 ) + ( n − 2 ∗ ( m − 1 ) − 1 ) ) 2 = 4 ∗ m ∗ ( n − m ) 4*\cfrac{m*((n-1)+(n-2*(m-1)-1))}{2}=4*m*(n-m) 42m((n1)+(n2(m1)1))=4m(nm)
(每一圈的数字可以看作由四个长度为 当 前 边 长 − 1 当前边长-1 1的数字段组成,然后等差数列求和计算即可)
则前 T − 1 T-1 T1圈的数字个数为 a n s = 4 ∗ ( T − 1 ) ∗ ( n − T + 1 ) ans=4*(T-1)*(n-T+1) ans=4(T1)(nT+1)(代入 m = T − 1 m=T-1 m=T1即可)。
v a l ( x , y ) = a n s + { ( n − y + 1 ) − ( T − 1 ) x = n − T + 1 2 ∗ ( n − 2 ∗ T + 1 ) + ( y − ( T − 1 ) ) x = T 3 ∗ ( n − 2 ∗ T + 1 ) + ( x − ( T − 1 ) ) y = n − T + 1 ( n − 2 ∗ T + 1 ) + ( n − x + 1 − ( T − 1 ) ) y = T val(x,y)=ans+ \begin{cases} (n-y+1)-(T-1)& x=n-T+1\\ 2*(n-2*T+1)+(y-(T-1))& x=T\\ 3*(n-2*T+1)+(x-(T-1))& y=n-T+1\\ (n-2*T+1)+(n-x+1-(T-1))& y=T\\ \end{cases} val(x,y)=ans+(ny+1)(T1)2(n2T+1)+(y(T1))3(n2T+1)+(x(T1))(n2T+1)+(nx+1(T1))x=nT+1x=Ty=nT+1y=T
即(上述算式含义为4段中的某几整段的数字个数+剩下的数字个数)
v a l ( x , y ) = a n s + { n − y − T + 2 x = n − T + 1 2 ∗ n + y − 5 ∗ T + 3 x = T 3 ∗ n + x − 7 ∗ T + 4 y = n − T + 1 2 ∗ n − x − 3 ∗ T + 3 y = T val(x,y)=ans+ \begin{cases} n-y-T+2& x=n-T+1\\ 2*n+y-5*T+3& x=T\\ 3*n+x-7*T+4& y=n-T+1\\ 2*n-x-3*T+3& y=T\\ \end{cases} val(x,y)=ans+nyT+22n+y5T+33n+x7T+42nx3T+3x=nT+1x=Ty=nT+1y=T
按照上述算式进行计算即可得到对应位置的值。

今年南京网络赛的A题就用到了这个东西
我的博客链接

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值