
本帖最后由 踢馆帝 于 2012-4-21 22:04 编辑
某一天,大法师被众多怪物包围,如图所示(俯视图),大法师站在点O,黑色圆点表示怪物。大法师可以释放“奥术屏障”魔法,奥术屏障是一个以大法师为中心的圆,半径为r,被屏障所围住的怪物都会被奥术震击致死
大法师还可以释放“闪烁”魔法,可以瞬间移动到任意位置。释放奥术屏障需要耗费大法师的魔法值,消耗量为r^2点魔法值,奥术震击每杀死一个怪物也会消耗大法师10点魔法。
闪烁同样会消耗魔法值,消耗量为闪烁距离h*10图中有4只怪物被奥术屏障围住,因此大法师在当前位置释放奥术屏障会消耗r^2 + 4*10 点魔法值考虑问题:现在有一群怪物在大法师周围,设为点集P,已知他们的坐标和大法师的坐标,大法师剩余魔法值N点,假设大法师在原地释放奥术屏障,写一个小程序,求得大法师最多能杀死多少只怪物。附加问题:假设大法师魔法值剩余很多,那么请你找到一个方法,杀死全部怪物,并且消耗魔法值最少。由于大法师情况危机,要求一次性杀死所有怪物
(提示,闪烁到某点之后,再释放奥术屏障)本题没有给出点集P,和魔法值N的具体数字,因此并不需要求出精确数字,重点在于程序的算法
在调试的时候,可以用随机函数生成点集P,然后确定一个数字N,试试看会得到什么结果
第二问画图版
private void ArcaneExplosion2(List *本站禁止HTML标签噢* P, Vector2 Location)
{
Vector2 NeedMoveTo = new Vector2();
Vector2 tempsum = Vector2.Zero;
foreach (var point in P)
{
tempsum += point;
}
NeedMoveTo = tempsum / P.Count;
if (NeedMoveTo != Location) MessageBox.Show("先闪现到" + NeedMoveTo.ToString());
double MaxLenth=0;
foreach (var point in P)
{
if ((point - NeedMoveTo).Length() > MaxLenth)
{
MaxLenth = (point - NeedMoveTo).Length();
}
}
MessageBox.Show("需要" + (MaxLenth * MaxLenth + P.Count * 10 + (NeedMoveTo - Location).Length()).ToString() + "点魔法值");
Graphics g = this.CreateGraphics();
Pen pen = new Pen(System.Drawing.Color.Black, 1);
g.DrawLine(pen, new System.Drawing.Point((int)Location.X, (int)Location.Y), new System.Drawing.Point((int)Location.X - 1, (int)Location.Y - 1));
g.DrawLine(pen, new System.Drawing.Point((int)Location.X, (int)Location.Y), new System.Drawing.Point((int)NeedMoveTo.X, (int)NeedMoveTo.Y));
g.DrawEllipse(pen,
(int)(NeedMoveTo.X - MaxLenth),
(int)(NeedMoveTo.Y - MaxLenth),
(int)MaxLenth*2,(int) MaxLenth*2);
foreach (var point in P)
{
g.DrawEllipse(pen,
(int)(point.X-2),
(int)(point.Y - 2),4,4);
}
}
[查看全文]