洛谷 P2239 螺旋矩阵

来源:互联网 发布:mysql配置文件my.ini 编辑:程序博客网 时间:2024/05/09 18:10

题目描述

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

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

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

1 2 3 4

12 13 14 5

11 16 15 6

10 9 8 7

现给出矩阵大小n以及i和j,请你求出该矩阵中第i行第j列的数是多少。

(本题目为2014NOIP普及T3)

输入输出格式

输入格式:

输入共一行,包含三个整数 n,i,j,每两个整数之间用一个空格隔开,分别表示矩阵大小、待求的数所在的行号和列号。

输出格式:

输出共一行,包含一个整数,表示相应矩阵中第i行第j列的数。

输入输出样例

输入样例#1:
4 2 3
输出样例#1:
14

说明

【数据说明】

对于50%的数据,1 ≤ n ≤ 100;

对于100%的数据,1 ≤ n ≤ 30,000,1 ≤ i ≤ n,1 ≤ j ≤ n。


又是一道一眼看上去就没有思路的题。。。

思路,先找出这个点在第几个‘口’中。

所以,‘口’的边长就是n-2*c+2。

可以推出‘口’个数是等差数列,前c-1个的个数就是自己推吧(我才不会告诉你代码里有)。

时间复杂度:O(1)。

最后,催促模拟.jpg。


#include<algorithm>#include<iostream>#include<cstdio>using namespace std;int n,x,y,c,ans;int main(){scanf("%d%d%d",&n,&x,&y);c=min(min(n-x+1,x),min(n-y+1,y));ans=4*(n-c+1)*(c-1);if(x==c)ans+=y-c+1;else if(y==n-c+1)ans+=n-3*c+x+2;else if(x==n-c+1)ans+=3*n-5*c-y+4;elseans+=4*n-7*c-x+5;printf("%d\n",ans);return 0;}


0 0
原创粉丝点击