NOIP 2014 螺旋矩阵

NOIP 2014 螺旋矩阵

洛谷传送门

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 ≤ 100;
对于 100%的数据,1 ≤ n ≤ 30,000,1 ≤ i ≤ n,1 ≤ j ≤ n。

最优解声明:

题解:

方法:

依题意模拟:50pts.

递归剥离层数:100pts

数据加强到10^9之后,不可做

思考(O(1))解法。

至于(O(1))解法,会在数据加强版的博客中详细讲解。

螺旋矩阵数据加强版

在这里递归就完全可以水过。递归好想又好写。

代码:

#include<bits/stdc++.h>
#define R register 
using namespace std;
inline void in(int &x) 
{
    int f=1;x=0;char s=getchar();
    while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
    while(isdigit(s)){x=x*10+s-'0';s=getchar();}
    x*=f;
}
int n,x,y,ans;
int main()
{
    in(n),in(x),in(y);
    here:;
    if(x==1)
		printf("%d",y+ans);
    else if(y==n)
		printf("%d",n+x-1+ans);
    else if(x==n)
		printf("%d",3*n-y-1+ans);
    else if(y==1)
		printf("%d",4*n-x-2+ans);
    else
    {
        ans+=4*n-4;
        x--,y--,n-=2;
        goto here;
    }
	return 0;
}
原文地址:https://www.cnblogs.com/fusiwei/p/13869536.html