您的位置:首页 > 其它

螺旋矩阵 题解

2016-01-23 10:13 316 查看
螺旋矩阵
 

【问题描述】

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

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

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

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

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



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

【题解】
首先,本题有两种思路。
1.老老实实填数组。(此方法简单易懂,但当矩阵过大时,就会出现数组开不够大,或long long也不够的情况)
2. 用算法找规律,但规律不是一般的难找。我就简单说说我找到的规律。

 

1234
1213145
1116156
10987
12
43
首先对比两表,你就会发现下表就是上表中间四格每个减去12,正好就是外圈12个数中最大的;
而12就是外圈边长的4倍减4;
于是,就成了这样

1234
12125
11346
10987
红色是内圈,黑色是外圈

红色基数为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);
}




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: