一个n行n列的螺旋矩阵可由如下方法生成:
从矩阵的左上角(第1行第1列)出发,初始时向右移动;如果前方是未曾经过的格子,则继续前进,否则右转;重复上述操作直至经过矩阵中所有格子。根据经过顺序,在格子中依次填入1,2,3,...,n2,便构成了一个螺旋矩阵。
下图是一个n=4时的螺旋矩阵。
现给出矩阵大小n以及i和j,请你求出该矩阵中第i行第j列的数是多少。
输入
输入共一行,包含三个整数 n,i,j,每两个整数之间用一个空格隔开,分别表示矩阵大小、待求的数所在的行号和列号。
1≤n≤30000,1≤i≤n,1≤j≤n
输出
输出共一行,包含一个整数,表示相应矩阵中第i行第j列的数。
思路是存贮每一环的值于sum数组
然后找到i,j对应在第k环中;
从环的左上角的值计算i,j到k,k的距离
需分几种情况
我分了三种
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#define ll long long
using namespace std;
#define hengheng main()
#define mem(a,b) memset(a,b,sizeof(a))
const int maxx=1e9+7;
int sum[30002];
int main()
{
int i,j,n,m,k,count,x,y,t;
scanf("%d%d%d",&n,&x,&y);
// 思路:用sum数组存储每一圈的值;
//scanf("%d",&n);
// while(scanf("%d%d",&x,&y)!=EOF)
{
k=0;t=n;
i=1;
while(k<=n*n&&t>0)
{
sum[i]=4*t-4;
t-=2;
k+=sum[i];
i++;
}
if(n%2==1)
sum[i-1]=1;
int ans=0;
// for(j=1;j<i;j++)
// printf("%d\n",sum[j]);
for(i=1;i<=n;i++) // 找在哪一环
{
if((x==i||y==i)||(x==n-i+1||y==n-i+1))
{
k=i;
break;
}
}
for(i=1;i<k;i++)
ans+=sum[i];
// printf("%d\n",ans);
//前k-1环的值
if(y==k) // 与k,k在同一列 ,计算少的用sun【k】减去即可
{
t=x-k;
if(t!=0)
ans+=sum[k]-t;
}
else
{
if(x==n-k+1)// 如果在下面
{
t=n-3*k+y+1;//计算少的用sun【k】减去即可 n-k+1为第y列于第k列距离 y-k为一列的差值
ans+=sum[k]-t;
}
else
{
t=(x-k)+(y-k);// 在右边就不用多说了
ans+=t;
}
}
printf("%d\n",ans+1);// 别忘了加 1
}
return 0;
}