赶上那些羊!


16

您是农夫,您的羊群逃脱了!不好了!

将围栏围起来,围住那些绵羊。作为预算有限的农民,您希望使用尽可能少的围栏。不过对您来说幸运的是,它们不是世界上最聪明的绵羊,在逃脱后也不会打扰他们。

任务

给定一个坐标列表,输出容纳绵羊所需的最少数量的围栏段。

规则

  • 如果绵羊不能走动,则将其包含在内(围栏无孔)。
  • 您不必将所有的绵羊都放在一个围栏中-可以有多个相互独立的围栏区域。
  • 栅栏段沿基本方向定向。
  • 每个座标元组代表一只绵羊。
  • 输入必须为正整数对x>0y>0,但可以根据您的语言正确设置格式。
    • 即:{{1,1},{2,1},{3,7}, .. }[1,2],[2,1],[3,7], ..
  • 围栏区域内的空白处还可以。
  • 您不能假定坐标以任何特定顺序输入。

例如,一只绵羊需要4完全围栏。

测试用例

[1,1]
4

[1,1],[1,2],[2,2]
8

[2,1],[3,1],[2,3],[1,1],[1,3],[3,2],[1,2],[3,3]
12

[1,1],[1,2],[2,2],[3,7],[4,9],[4,10],[4,11],[5,10]
22

[1,1],[2,2],[3,3],[4,4],[5,5],[6,6],[7,7],[8,8],[9,9]
36

[1,1],[2,2],[3,3],[4,4],[6,6],[7,7],[8,8],[9,9]
32

[2,1],[8,3],[8,4]
10

笔记

  • 您可以假设输入坐标有效。
  • 理论上,您的算法应适用于任何较大的整数坐标(最高为您的语言支持的最大值)。
  • 完整的程序或功能答案都可以。

这是,因此最短答案以字节为单位!


输入是否可以是x坐标列表,然后是y坐标列表?例如{1,2,3,4},{5,6,7,8} -> {1,5},{2,6},{3,7},{4,8}
Pavel

@Phoenix Nope,每个x,y输入必须在一起。不错的想法,但我自己却没有想到。
CzarMatt

坐标范围是多少?0和负数可能吗?
AGourd

3
这是非常困难的。每次我认为我有一种可以处理所有情况的启发式方法时,我会错过一些东西。
xnor

1
哇,真是挑战。我承认自己的损失;在05AB1E中执行此操作。
Magic Octopus Urn

Answers:


5

的JavaScript(ES6),251个 244 275字节

a=>Math.min(...(P=(a,r=[[a]],c=a[0])=>(a[1]&&P(a.slice(1)).map(l=>(r.push([[c],...l]),l.map((_,i)=>r.push([[c,...l[i]],...((b=[...l]).splice(i,1),b)])))),r))(a).map(L=>L.reduce((p,l)=>l.map(([h,v])=>(x=h<x?h:x,X=h<X?X:h,y=v<y?v:y,Y=v<Y?Y:v),x=y=1/0,X=Y=0)&&p+X-x+Y-y+2,0)))*2

怎么样?

我们使用递归函数P()创建输入列表的所有可能分区的列表。该函数当前不是最优的,因为它返回了一些重复的分区-但是这不会改变最终结果。

对于每个分区,我们计算用矩形包围每组中的所有绵羊所需的围栏数量。这些围栏的总和给出了分区的分数。我们最终返回最低分。

测试用例


关于步骤2,为什么不[ [1,1],[2,2] ] , [ [1,2] ]呢?
edc65

@ edc65希望现在应该修复它。
Arnauld

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.