您的位置:首页 > 其它

[普及]NOIP 2014 螺旋矩阵

2016-10-28 17:08 232 查看
题目描述

一个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。

【分析】

这题比较2…惊天大模拟

【代码】

//[普及]NOIP 2014 螺旋矩阵
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<cmath>
#include<vector>
#define fo(i,j,k) for(i=j;i<=k;i++)
using namespace std;
int n,x,y,ans;
inline void print()
{
printf("%d\n",ans);
exit(0);
}
int main()
{
int i,j,c,t;
scanf("%d%d%d",&n,&x,&y);
t=n;
c=min(x,y);
c=min(c,min(n+1-x,n+1-y));
fo(i,1,c-1)
{
ans+=4*(t-1);
t-=2;
}
int h=c,l=c,tot=0;
fo(tot,1,t)
{
ans++;
if(h==x && l==y) print();
l++;
}l--;h++;
fo(tot,1,t-1)
{
ans++;
if(h==x && l==y) print();
h++;
}h--;l--;
fo(tot,1,t-1)
{
ans++;
if(h==x && l==y) print();
l--;
}l++;h--;
fo(tot,1,t-2)
{
ans++;
if(h==x && l==y) print();
h--;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: