UVa 10233 - Dermuba Triangle

題目:如題目圖中,每個三角形中心有一個房子,問你給定兩個編號的房子間距離。

分析:計算幾何。按順序找到三角形的位置(行、列)以及方向,計算記錄即可。

            首先,利用地推關係找到對應三角形的位置(每層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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值