螺旋矩阵

仍然没从昨天WA的阴影中脱离出来

一道看似暴力就可以的暴力题

题目:

数据范围:

枚举是要炸的

那就推导些公式

某大佬的数学做法:

拿个矩阵行列式比划下:

1    2    3    4    5    6    7

24  25  26  27  28  29  8

23  40  41  42  43  30  9

22  39  48  49  44  31  10

21  38  47  46  45  32  11

20  37  36  35  34  33  12

19  18  17  16  15  14  13

拿到横纵坐标判断其所处之圈

并且预处理必要变量,比如每圈首项,每圈项数等

再推导下必要公式

圈数:

由玄学可知,圈数(以1开始)编号是由该点到边框的最短距离决定的

于是有:

min(啊,宅,n-啊+1,n-宅+1);

min(i,j,n-i+1,n-j+1);

每项项数就是小学数学,甚至不是小学奥数...

xiangshu=(n-(i(圈数)-1)*2-1)*4

求项数以后暴力枚举就好:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
int a,b;
int main(){
    scanf("%d%d%d",&n,&a,&b);
    int round=min(a,min(b,min(n-a+1,n-b+1)));
    int start=1;
    for(int i=1;i<=round-1;i++)
        start+=(n-(i-1)*2-1)*4;
    for(int i=round;i<=n-round+1;i++){
        if(round==a&&i==b){
            printf("%d\n",start);
            return 0;
        }start++;
    }
    for(int i=round+1;i<=n-round+1;i++){
        if(i==a&&n-round+1==b){
            printf("%d\n",start);
            return 0;
        }start++;
    }
    for(int i=n-round;i>=round;i--){
        if(n-round+1==a&&i==b){
            printf("%d\n",start);
            return 0;
        }start++;
    }
    for(int i=n-round;i>=round+1;i--){
        if(i==a&&round==b){
            printf("%d\n",start);
            return 0;
        }start++;
    }
}

van♂shit

T2:回文日期(不知你们听不听)

屠龙宝刀点击送

posted @ 2019-06-19 10:03  _Alex_Mercer  阅读(1368)  评论(0编辑  收藏  举报