【洛谷p2239】螺旋矩阵

关于题前废话:

这道题的数据范围过于强大了qwq,显然如果我们开一个30000*30000的二维数组来模拟,显然首先就开不下这么大的数组,然后暴力搜索的话也会爆掉,所以直接模拟显然是一个不正确的选择(当然直接模拟可以用作骗分大法)


既然数据那么大,显然一定是有数学规律的(要不然这道题我们没法做),所以我们可以尝试找一下规律:

观察矩阵:

(暗中观察:ych)

首先可以知道的是,当i==1时(也就是在第一行),对应的值就是j所对应的值。

当i==n时,所对应的值就是3*n-2-j+1;(3*n-2表示的是第n行最左边的数的值,-j+1也就是第j行的值)

当j==1时,所对应的值是4*n-2-i;

当j==n时,对应的值是n+x-1;

然后对于这个很多很多层的矩阵,我们可以对其进行抽丝剥茧(就像洋葱一层一层剥开矩阵的心),每剥开一层,n-2,所要求的点相对于新矩阵的行列坐标分别-1,同时值+4*n-4;

于是我们用很短的代码就可以AC啦:

CODE:

#include<bits/stdc++.h>

using namespace std;

int n,i,j;

int dg(int n,int x,int y){
    if(x==1) return y;
    if(x==n) return 3*n-1-y;
    if(y==n) return n+x-1;
    if(y==1) return 4*n-2-x;
    return dg(n-2,x-1,y-1)+4*n-4;
}

int main(){
    scanf("%d %d %d",&n,&i,&j);
    cout<<dg(n,i,j);
}

end-

posted @ 2019-06-19 14:19  Sweetness  阅读(364)  评论(0编辑  收藏  举报