[不指定 2005/09/12 22:47 | by turbozv ]
比较有趣,大家有兴趣可以试试smile

点击在新窗口中浏览此图片

【问题描述】
有这样一个蜂房(如图),从中心点0一层一层向外扩展,每一个蜂巢都被编上一个唯一的整数编号。蜜蜂可以在相邻的两个蜂巢之间移动,比如在0点的蜜蜂可以移动到相邻的1,2,3,4,5,6号蜂巢。现在有一只蜜蜂在蜂巢A,它要移动到蜂巢B,问最短经过几个蜂巢


【样例输入】
10
6


【样例输出】
3


参考程序: http://down.turbozv.com/ex/bee.c
程序 | 评论(3) | 引用(0) | 阅读(7983)
聪聪
2005/09/13 18:17
呵呵
玮哥牛鼻阿
turbozv
2005/09/13 08:23
cool coolsmile
turbozv 回复于 2006/08/22 20:59
python程序也放在down.turbozv.com下面,仔细找找:)
rlei
2005/09/13 04:30
没得pre哈,不过看来缺省相当于pre

[font=\"courier new\"]
#include <stdio.h>
#include <assert.h>
#include <math.h>

#define max(a, b)   ((a) > (b) ? (a) : (b))
#define abs(a)      ((a) > 0 ? (a) : -(a))

int getRadius(int number)
&leftsign;
   // (-b +/- sqrt(b^2 - 4ac)) / 2a
   return (int)ceil((-1 + sqrt(1 + 4 * 2 * ((number + 5) / 6))) / 2);
&rightsign;

void getPos(int number, int *dx, int *dy, int *dz)
&leftsign;
   assert (number >= 0);

   int radius = getRadius(number);
   if (radius == 0) &leftsign;
       *dx = *dy = *dz = 0;
       return;
   &rightsign;

   int x, y, z;

   /* biggest number of inner circle */
   int base = radius * (radius - 1) / 2 * 6;

   /* the value of radius is also the length of one edge */
   number -= base;
   int edge = (number - 1) / radius;

   switch (edge % 3) &leftsign;
       case 0:
           x = radius * (edge + 1) - number;
           y = radius;
           z = radius * edge - number;
           break;
       case 1:
           x = radius * edge - number;
           y = radius * (edge + 1) - number;
           z = -radius;
           break;
       case 2:
           x = -radius;
           y = radius * edge - number;
           z = number - radius * (edge + 1);
           break;
       default:
           assert(0);
           break;
   &rightsign;
   if (edge >= 3) &leftsign;
       x = -x;
       y = -y;
       z = -z;
   &rightsign;
   *dx = x;
   *dy = y;
   *dz = z;
&rightsign;

int distance(int a, int b)
&leftsign;
   int x1, y1, z1;
   int x2, y2, z2;

   getPos(a, &x1, &y1, &z1);
   getPos(b, &x2, &y2, &z2);

   return max(max(abs(x2 - x1), abs(y2 - y1)), abs(z2 - z1));
&rightsign;

int main()
&leftsign;
   /* 测试案例略... */
   return 0;
&rightsign;
[/font]
分页: 1/1 第一页 1 最后页