螺旋矩阵
仍然没从昨天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:回文日期(不知你们听不听)