读书人

一个算法题解决思路

发布时间: 2012-01-02 22:40:04 作者: rapoo

一个算法题
设有长宽高都为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;
}
/*解,小所在的位置面立方的面,小由最近的 爬向自己最近的(底面跨面偏移宜一界位);
* 由底面,爬向最的一跨面偏移宜一界位. 再加上最後一面的界位.
* 如果忽略界位,那果是 小到最近顶点的距离 加 两个不可能在同一平面的顶点 之间的最短距离*/

读书人网 >C#

热点推荐