JDOJ 2895: 螺旋矩阵

JDOJ 2895: 螺旋矩阵

JDOJ传送门

Description

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

从矩阵的左上角(第 1行第 1列)出发,初始时向右移动;如果前方是未曾经过的格子,则继续前进,否则右转;重复上述操作直至经过矩阵中所有格子。根据经过顺序,在格子中依次填入 1, 2, 3, ... , n2,便构成了一个螺旋矩阵。

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

现给出矩阵大小 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;
}
原文地址:https://www.cnblogs.com/fusiwei/p/13869660.html