題目:如題目圖中,每個三角形中心有一個房子,問你給定兩個編號的房子間距離。
分析:計算幾何。按順序找到三角形的位置(行、列)以及方向,計算記錄即可。
首先,利用地推關係找到對應三角形的位置(每層1,3,5,奇數和n^2);
然後,判斷方向,每行的一個朝上,依次交替(倒的高sqrt3/6);
最後,計算兩點間距離即可。
說明:╮(╯▽╰)╭;
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
double sqrt3 = sqrt(3.0);
typedef struct _point
{
double x, y;
}point;
int TriangleY(int n)
{
return (int)sqrt(n+0.9);
}
int TriangleX(int n)
{
int up = TriangleY(n);
return n-(up*up+up);
}
int TriangleUp(int n)
{
int up = TriangleY(n);
return (n-up*up)%2;
}
double Distance(int n, int m)
{
point p, q;
p.x = TriangleX(n)*0.5, p.y = TriangleY(n)*sqrt3/2;
q.x = TriangleX(m)*0.5, q.y = TriangleY(m)*sqrt3/2;
if (TriangleUp(n))
p.y -= sqrt3/6.0;
if (TriangleUp(m))
q.y -= sqrt3/6.0;
return sqrt((p.x-q.x)*(p.x-q.x)+(p.y-q.y)*(p.y-q.y));
}
int main()
{
int n, m;
while (~scanf("%d%d",&n,&m))
printf("%.3lf\n",Distance(n, m));
return 0;
}