题意:这题图看不太清,大意就是给定蜂巢上两点,求他们的最短距离。
题解:首先定然是建一个好一点的系,实际上也说不上好坏,能表示就行。我的系是向下走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;
}