[普及]NOIP 2014 螺旋矩阵

来源:互联网 发布:纳贝调试软件 编辑:程序博客网 时间:2024/06/06 01:01

题目描述

一个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;}
1 0
原创粉丝点击