首页 > 编程知识 正文

螺旋矩阵 题解,螺旋矩阵计算公式

时间:2023-05-04 05:57:22 阅读:190766 作者:3367

螺旋矩阵

 

【问题描述】

一个n行n列的螺旋矩阵可由如下方法生成:

从矩阵的左上角(第1行第1列)出发,初始时向右移动;

如果前方是未曾经过的格子, 则继续前进,否则右转;

重复上述操作直至经过矩阵中所有格子。根据经过顺序,在格子中依次填入1, 2, 3, ... , n2,便构成了一个螺旋矩阵。

下图是一个n = 4 时的螺旋矩阵。 


现给出矩阵大小n以及i和j,请你求出该矩阵中第i行第j列的数是多少。






【题解】

首先,本题有两种思路。

1.老老实实填数组。(此方法简单易懂,但当矩阵过大时,就会出现数组开不够大,或long long也不够的情况)

2. 用算法找规律,但规律不是一般的难找。我就简单说说我找到的规律。

 
12341213145111615610987
1243

首先对比两表,你就会发现下表就是上表中间四格每个减去12,正好就是外圈12个数中最大的;

而12就是外圈边长的4倍减4;

于是,就成了这样

1234121251134610987

红色是内圈,黑色是外圈

红色基数为12,黑色基数为0


同时,每一圈最上方的一行就是i的值。

最右方的一列就是n(i)+j-1的值。

最下方的一行就是4n-i-j-1的值。

最左方的一列就是4n-i-j-1的值。

(一定要记得加上外圈基数哦!)



【参考程序】

c语言


<pre name="code" class="cpp">#include<cstdio>int i=2,j=3,n=3;void luo(int n1){int a=0,k,l;for (l=1;l<n1;l++){a=a+n*4-l*8+4;}if (i>=j) printf ("%d",a+i+j-2*n1+1);else printf ("%d",a+(n-2*n1+1)*4-i-j+n1+n1+1);}int main(){int i1,j1;scanf ("%d %d %d",&n,&j,&i);i1=i;j1=j;if (i1>n/2) i1=n-i1+1;if (j1>n/2) j1=n-j1+1;if(i1>j1) luo(j1);else luo(i1);}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。