我试图解决我已经给出的编程任务,而且我不知道该怎么做。
这是问题所在:
Skinny Pete受邀参加花园生日派对。他不是真的 像派对太多,但听说生日蛋糕将是 非常棒,他不想错过尝试它的机会。
只有一个小问题。有一个喷水灭火系统 安装在花园里,通过了解他的朋友,有一个很高的 有人把它作为派对恶作剧的机会。皮特喜欢蛋糕,但是 真的讨厌弄湿。幸运的是,他发现了一个花园的草图 有喷头的位置和每个喷洒的距离 水
- 花园看起来像一个矩形,一面开着,房子就在另一边。
- 蛋糕将在房子里。
- 另外两边有围栏,所以不能进入那里,房子没有后门。皮特很感兴趣 知道是否有可能进入花园并到达房子 没有任何弄湿的风险。
为简单起见,我们可以认为花园的地图是笛卡儿式的 坐标系。
花园是一个矩形,其边与轴平行,左下角位于原点(0,0)。
花园的入口是左侧,房子位于右侧。
洒水器表示为具有中心和半径的圆圈。走进这样一个圆圈内的任何地方可能会让你感到困惑。
出于这个问题的目的,由于Pete太瘦了,我们可以认为他只是在太空中旅行的一个点,真实的 数字作为坐标。
输入规格标准输入的第一行包含两行 空格分隔整数H和W,高度和宽度 花园。
下一行包含喷头N的数量。之后是N行 遵循三个空格分隔的整数 - Xi,Yi和Ri。 这是一个喷头作为圆心的描述,中心(Xi,Yi)和 半径Ri。
1≤N≤128
1≤H,W≤1024
0≤Xi≤W
0≤Yi≤H
1≤Ri≤1024
输出规格
如果是,则输出包含“CAKE”(不含引号)的单行 可以在没有弄湿的情况下到达房子并且“没有蛋糕”(没有 引号)否则。
事先感谢帮助者
答案 0 :(得分:7)
由于您没有显示任何代码,而您只是暗中寻求帮助,我会给出一个关键的想法,并将数学和实施留给您。
Skinny Pete可以在不弄湿的情况下获得蛋糕除非在花园的底部和顶部之间有一连串的洒水圈。换句话说,我们可以假设皮特成功了。但请浏览所有圈子。我们看到是否有任何圆与花园的底边相交 - 这很容易数学。如果没有,皮特真的成功了。如果有,看看是否有另一个圆与第一个圆相交,那么如果有另一个圆与第二个圆相交,等等。最后,你看看这个链中的最后一个圆是否与花园的顶边相交。如果有任何这样的交叉圆链也与花园的顶部和底部相交,那么可怜的皮特就会挨饿。 (请注意,只有一个与顶部和底部相交的圆圈也会使Pete受挫 - 认为这是一个链条。)
以下是您的比赛PDF中的第二个示例的图表,其中您可以看到没有跨越圈子链,因此Pete成功。
这是Pete失败的第三个例子。请注意,左侧有一个四个圆圈,颜色为蓝色,横跨花园。
鉴于这个想法,有一个明显的O(N^2)
算法可以找到所有相交的圆圈和一个O(N)
算法来找到与花园顶部和底部相交的圆圈。您可以使用图论中的路径查找算法来解决您的问题。将顶部和底部以及圆圈视为图中的节点,如果它们相交,则两个节点与边连接。然后,您可以在表示顶部和底部的节点之间搜索路径。
在计算数学,算法和代码方面祝你好运。