日期:2014-05-19  浏览次数:21048 次

一个算法题
设有长宽高都为X的立方体一个   ,求   一个小虫在立方体   表面任意位置   爬遍所有立方体的面的最短路径  

另谁能给讲讲UML   看了网上几遍文章   没看太懂...

------解决方案--------------------
(1+Sqrt(2))*X

因为一个顶点是属于三个面,一个正方体是6个面,所以我们只需要到达两个相对的顶点即可走完所有面。

假设我们从一个顶点出发,对角线到达另一个顶点,再走一条边到达与出发点相对的那个顶点,就可以了。

所以路程就是Sqrt(2)*X+X
------解决方案--------------------
走到对顶点的距离并不是(1+Sqrt(2),而是Sqrt(5)!
高中立体几何中学过,确如gwl1984()所言,“ 把立方体展开成平面”
------解决方案--------------------
应该到最近的顶点的距离加两个顶点之间的最短距离
------解决方案--------------------
/// <summary>
/// 設邊長為bLength的立方體,求一個小蟲在立方體表面任意位置(Point),爬遍立方體所有面的最短路徑(Result).
/// </summary>
/// <param name= "bLength "> 正方體的邊長 </param>
/// <param name= "p "> Point position </param>
/// <param name= "minLength "> 最小臨界位 </param>
/// <returns> Result </returns>
public virtual double GetDistance(int bLength,Point p, int minLength)
{
if(bLength < 3)
{
return 0;
}
double middleNum = ((double)bLength)/2;
int pX = p.X;
int pY = p.Y;
int sideA = 0;
int sideB = 0;
int overPst = bLength - minLength;
double result = 0;

if(pX <= middleNum)
{
if(pY <= middleNum)
{
sideA = pY;
sideB = pX + overPst;

}
else
{
sideA = pX;
sideB = (bLength - pY) + overPst;
}
}
else
{
if(pY <= middleNum)
{
sideA = bLength - pX;
sideB = pY + overPst;
}
else
{
sideA = bLength - pY;
sideB = (bLength - pX) + overPst;
}
}

result = Math.Sqrt(sideA * sideA + sideB * sideB) + overPst*Math.Sqrt(2) + 2*(minLength*Math.Sqrt(2)) + minLength;
return result;
}
/*解釋,設小蟲所在的位置面為立方體的頂面,小蟲經由最近的邊 爬向離自己最近的(底面頂點跨面偏移宜一個臨界位);
* 經由底面,爬向最遠的一個頂點跨面偏移宜一個臨界位. 再加上最後一個面的臨界位.
* 如果忽略臨界位,那結果應該是 小蟲到最近顶点的距离 加 两个不可能在同一平面的顶点 之间的最短距离*/