题目:
三角形坐标系。观察整个三角形,由三个方向的直线将区域分割,横线、左斜线、右斜线。这是一个三维坐标系,三个方向的直线标定三个维度,每个区域(小三角形的标号)都可以由一组三维坐标唯一确定。
两点间距离。在这种三角形坐标系下,重新定义两点间距离,两点之间的曼哈顿距离即为两点间的最短路径。
找规律。仅由小三角形标号就可以确定其坐标,推倒过程依赖等差数组求和和找规律。
层数z。前z层区域数量和 sum(z)=1+3+⋯+(2z−1)=z2 ,因此, z−1=a−1−−−−√ 。
z=a−1−−−−√+1
左坐标。z层最大标号 z2 ,最大标号与标号a差值 z2−a ,2个一组。
l=z2−a2+1
右坐标。z-1层最大标号 (z−1)2 ,标号a与上一层最大标号差值 a−(z−1)2 ,2个一组。
l=a−(z−1)22 代码: #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <string> #include <iostream> #include <stack> #include <map> #include <queue> #include <vector> #include <algorithm> #define mem(a,b) memset(a,b,sizeof(a)) #define N 999999+20 #define M 200010 #define MOD 1000000000+7 #define inf 0x3f3f3f3f using namespace std; int main() { int m,n,hang_m,hang_n,r_m,r_n,l_m,l_n; while(~scanf("%d%d",&m,&n)) { hang_m=(int)ceil(sqrt(m)); hang_n=(int)ceil(sqrt(n)); r_m=(m-(hang_m-1)*(hang_m-1)-1)/2+1; r_n=(n-(hang_n-1)*(hang_n-1)-1)/2+1; l_m=(hang_m*hang_m-m)/2+1; l_n=(hang_n*hang_n-n)/2+1; int num=(int)(fabs(hang_m-hang_n)+fabs(l_m-l_n)+fabs(r_m-r_n)); printf("%d\n",num); } return 0; }