NOIP 2014 螺旋矩阵
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 ≤ 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;
}