• JDOJ 2895: 螺旋矩阵


    JDOJ 2895: 螺旋矩阵

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


    题解:

    数据加强,N变成10的9。

    肯定是O(1)啦!

    考虑先把层数处理出来,然后按最外层性质直接给出答案。

    代码:

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    int n,x,y,q,ans;
    signed main()
    {
    	scanf("%lld%lld%lld",&n,&x,&y);
    	q=min(x-1,n-x);
    	q=min(q,y-1);
    	q=min(q,n-y);
    	ans+=q*(4*n-4*q);
    	if(x-q==1)
            ans+=y-q;
    	else if(x+q==n)
            ans+=3*n-5*q-1-y;
    	else if(y-q==1)
            ans+=4*n-7*q-2-x;
    	else  
            ans+=n-3*q+x-1;
    	printf("%lld",ans);
    	return 0;
    }
    
  • 相关阅读:
    bzoj 1087 状压dp
    HDU 5289 尺取
    HDU 1693 插头dp入门详解
    字符串操作
    河南省多校联萌(一)
    HDU 4815 概率dp,背包
    HDU4804 Campus Design (轮廓线DP)
    HDU 4828 逆元+catalan数
    HDU 5651 组合+逆元
    天才少年曹原的内心
  • 原文地址:https://www.cnblogs.com/fusiwei/p/13869660.html
Copyright © 2020-2023  润新知