POJ 1870 Bee Breeding

题意:这题图看不太清,大意就是给定蜂巢上两点,求他们的最短距离。

题解:首先定然是建一个好一点的系,实际上也说不上好坏,能表示就行。我的系是向下走x+1,反之x-1,向右下走y+1,左上走y-1,对于给定数字,转换成坐标的话先讨论它是第几层,然后看它是这一层的第几个点,因此判断它是第几条边,再根据坐标系转换。转换完成后,增加x坐标,y坐标可以-1也可以不变,减少x坐标,y坐标可以+1也可以不变,因此可以讨论出两点的距离。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
void solve(int k,int &x,int &y)
{
    int n=0,a,b;
    while(1+3*n*(n+1)<k)n++;
    if(n==0)
    {
        x=0,y=0;
        return;
    }
    k=k-1-3*n*(n-1);
    a=(k-1)/n;
    b=(k-1)%n+1;
    switch(a)
    {
        case 0:
            x=b;
            y=n-b;
            return;
        case 1:
            x=n;
            y=-b;
            return;
        case 2:
            x=n-b;
            y=-n;
            return;
        case 3:
            x=-b;
            y=-n+b;
            return;
        case 4:
            x=-n;
            y=b;
            return;
        case 5:
            x=-n+b;
            y=n;
            return;
    }
}
int main()
{
    int a,b,x1,x2,y1,y2;
    while(scanf("%d%d",&a,&b),a||b)
    {
        solve(a,x1,y1);
        solve(b,x2,y2);
        int dx=x2-x1,dy=y2-y1,ans=0;
        int abx=abs(dx),aby=abs(dy);
        if(dx*dy<=0)
            ans=abx+((aby<=abx)?0:aby-abx);
        else
            ans=abx+aby;
        printf("The distance between cells %d and %d is %d.\n",a,b,ans);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值