螺旋矩阵
螺旋矩阵是指一个呈螺旋状的矩阵,它的数字由右上角开始向下依次填充,到边界之后继续向左边填充吗,然后依次是上边和右边。如此循环。图例如下:
我们规定左下角的坐标是
(
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
n−2,以此类推…)上(假设是
T
T
T),然后先计算出前
T
−
1
T-1
T−1圈的总的数字数量,然后再计算出第T圈中小于等于所求位置数字的数字数量,就可以得到对应位置的值了。具体情况如下:
首先第
T
T
T圈的边长为
n
−
2
(
T
−
1
)
=
n
+
2
T
+
2
n-2(T-1) = n+2T+2
n−2(T−1)=n+2T+2,当前点
(
x
,
y
)
(x,y)
(x,y)位于从下往上数第
y
y
y行,从上往下数第
n
−
y
+
1
n-y+1
n−y+1行,从左往右数第
x
x
x列,从右往左数第
n
−
x
+
1
n-x+1
n−x+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(n−x+1,n−y+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)
4∗2m∗((n−1)+(n−2∗(m−1)−1))=4∗m∗(n−m)
(每一圈的数字可以看作由四个长度为
当
前
边
长
−
1
当前边长-1
当前边长−1的数字段组成,然后等差数列求和计算即可)
则前
T
−
1
T-1
T−1圈的数字个数为
a
n
s
=
4
∗
(
T
−
1
)
∗
(
n
−
T
+
1
)
ans=4*(T-1)*(n-T+1)
ans=4∗(T−1)∗(n−T+1)(代入
m
=
T
−
1
m=T-1
m=T−1即可)。
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+⎩⎪⎪⎪⎨⎪⎪⎪⎧(n−y+1)−(T−1)2∗(n−2∗T+1)+(y−(T−1))3∗(n−2∗T+1)+(x−(T−1))(n−2∗T+1)+(n−x+1−(T−1))x=n−T+1x=Ty=n−T+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+⎩⎪⎪⎪⎨⎪⎪⎪⎧n−y−T+22∗n+y−5∗T+33∗n+x−7∗T+42∗n−x−3∗T+3x=n−T+1x=Ty=n−T+1y=T
按照上述算式进行计算即可得到对应位置的值。
今年南京网络赛的A题就用到了这个东西
我的博客链接