想到坐标的转换是重点。参看pku 2265 bee maja
#include
<
iostream
>
#include
<
cmath
>
#include
<
algorithm
>
using
namespace
std;

//
1 is inlayer 0
//
east ,west ,...
void
getPos(
int
&
x,
int
&
y,
int
l)

...
{
int type,temp,k;
k = ceil((-1+sqrt(1.0+4.0/3.0*l))/2.0);
l-=1+3*k*(k-1);
type=l/k;//确定在哪个方位
temp=l%k;//确定是这个方位的第几个元素

if(type==1) ...{
x=k;y=-temp;

} else if(type==2) ...{
x=k-temp;y=-k;

} else if(type==3) ...{
x=-temp;y=-k+temp;

} else if(type==4) ...{
x=-k;y=temp;

} else if(type==5) ...{
x=-k+temp;y=k;

} else if(type==0) ...{
x=temp;y=k-temp;
if(l==0) y--;
}
return;
}

int
main()

...
{
int a,b;
int x1,y1,x2,y2;
while (scanf("%d%d",&a,&b)!=EOF)

...{
if (a==0)break;
printf("The distance between cells %d and %d is ",a,b);
getPos(x1,y1,a);
getPos(x2,y2,b);
x2-=x1;
y2-=y1;
if (x2*y2>0)
printf("%d",abs(x2+y2));
else
printf("%d",max(abs(x2),abs(y2)));
printf(". ");
}
}