JDOJ 2895: 螺旋矩阵
JDOJ 2895: 螺旋矩阵
Description
一个 n行 n列的螺旋矩阵可由如下方法生成:
从矩阵的左上角(第 1行第 1列)出发,初始时向右移动;如果前方是未曾经过的格子,则继续前进,否则右转;重复上述操作直至经过矩阵中所有格子。根据经过顺序,在格子中依次填入 1, 2, 3, ... , n2,便构成了一个螺旋矩阵。
下图是一个 n = 4时的螺旋矩阵。
现给出矩阵大小 n以及 i和 j,请你求出该矩阵中第 i行第 j列的数是多少。
Input
输入共一行,包含三个整数 n,i,j,每两个整数之间用一个空格隔开,分别表示矩阵大小、待求的数所在的行号和列号。
Output
输出共一行,包含一个整数,表示相应矩阵中第 i行第 j列的数。
Sample Input
4 2 3
Sample Output
14
HINT
【数据说明】
对于 50%的数据,1 ≤ n ≤ 30,000;
对于 100%的数据,1 ≤ n ≤ 109,1 ≤ i ≤ n,1 ≤ j ≤ n。
题解:
数据加强,N变成10的9。
肯定是O(1)啦!
考虑先把层数处理出来,然后按最外层性质直接给出答案。
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,x,y,q,ans;
signed main()
{
scanf("%lld%lld%lld",&n,&x,&y);
q=min(x-1,n-x);
q=min(q,y-1);
q=min(q,n-y);
ans+=q*(4*n-4*q);
if(x-q==1)
ans+=y-q;
else if(x+q==n)
ans+=3*n-5*q-1-y;
else if(y-q==1)
ans+=4*n-7*q-2-x;
else
ans+=n-3*q+x-1;
printf("%lld",ans);
return 0;
}