二维平面上的最长路径


14

为您提供了一组任意的,任意的2d整数笛卡尔坐标:例如[[(0,0),(0,1),(1,0)]

从这组坐标中找到可能的最长路径,并限制只能“访问”一次坐标。(而且您不会“回到”开始时的坐标)。

重要:

您不能“越过”坐标或其周围。例如,在最后一个音符示例(矩形)中,您不能不访问C就从D移到A (这可能是重新访问,从而使找到的长度无效)。@FryAmTheEggman指出了这一点。

函数输入:二维笛卡尔坐标数组
函数输出:仅最大长度
获胜者: 最短代码获胜,没有保留被禁止(不是时空效率最高的)


例子

原点三角形

1:在上面所示的情况下,没有两次“访问”坐标的最长路径是A-> B-> O(或OBA或BAO),并且路径长度是sqrt(2)+ 1 = 2.414




广场

2:在上述情况下,两次没有坐标“访问”的最长路径是ABOC(显然是COBA,OCAB等),对于所示的单位平方,它计算为sqrt(2)+ sqrt(2)+ 1 = 3.828。


注意:这是一个额外的测试用例,它不如前两个示例那么简单。这是由6个坐标组成的矩形:

在此处输入图片说明

在这里,最长的路径是:A-> E-> C-> O-> D-> B,即8.7147
(最大可能的对角线走过且没有横越任何边)


这是一个非常相似的问题,尽管得分不同。
Geobits '16

@Geobits同意,但是我在这里对问题进行了详细说明后不会说“非常”。因此,任何最小/最大路径问题本质上都是您平常的图形怀疑者的某种味道。我对这里的字节节省解决方案感兴趣。
BluePill

@Fatalize完成。是8.7147。
BluePill

顺便说一句:欢迎来到PPCG!
致命

@Fatalize谢谢!(实际上,我在这里已经观察了一段时间了,从今天开始我就变得活跃起来并参与了整个工作)。:)
BluePill

Answers:


3

Pyth,105 103 100 92 86个字节

V.pQK0FktlNJ.a[@Nk@Nhk)FdlNI&!qdk&!qdhkq+.a[@Nk@Nd).a[@Nd@Nhk)J=K.n5B)=K+KJ)IgKZ=ZK))Z

              Z = 0 - value of longest path
              Q = eval(input())

V.pQ         for N in permutations(Q):
  K0           K = 0 - value of current path
  FktlN        for k in len(N) - 1:
    J.a          set J = distance of
    [@Nk                 Q[k] and Q[k+1]
    @Nhk)    
    FdlN         for d in len(N):
I&                 if d != k && d != (k + 1)
!qdk
&!qdhk
q+                and if sum of
.a                   distance Q[k] and Q[d]
 [@Nk                
 @Nd)                
.a                   distance Q[d] and Q[k+1]
 [@Nd
 @Nhk)
J                    are equal to J then
  =K.n5              set K to -Infinity
  B                  and break loop
                     ( it means that we passed over point )
  )                   end of two if statements
=K+KJ                  K+=J add distance to our length
)                      end of for
IgKZ                   if K >= Z - if we found same or better path
  =ZK                  Z = K       set it to out max variable
))                     end of two for statements
Z                      output value of longest path 

在这里尝试!


2

Mathematica,139个字节

Max[Tr@BlockMap[If[1##&@@(Im[#/#2]&@@@Outer[#/Abs@#&[#-#2]&,l~Complement~#,#])==0,-∞,Abs[{1,-1}.#]]&,#,2,1]&/@Permutations[l=#+I#2&@@@#]]&

测试用例

%[{{0,0},{0,1},{1,0},{1,1},{2,0},{2,1}}]
(* 3 Sqrt[2]+2 Sqrt[5] *)

%//N
(* 8.71478 *)

1

Perl中,341个 322 318字节

sub f{@g=map{$_<10?"0$_":$_}0..$#_;$"=',';@l=grep{"@g"eq join$",sort/../g}glob"{@g}"x(@i=@_);map{@c=/../g;$s=0;$v=1;for$k(1..$#c){$s+=$D=d($k-1,$k);$_!=$k&&$_!=$k-1&&$D==d($_,$k)+d($_,$k-1)and$v=0 for 0..$#c}$m=$s if$m<$s&&$v}@l;$m}sub d{@a=@{$i[$c[$_[0]]]};@b=@{$i[$c[$_[1]]]};sqrt(($a[0]-$b[0])**2+($a[1]-$b[1])**2)}

该代码最多支持100分。因为它会产生所有可能的点排列,所以100个点将至少需要3.7×10 134 yottabytes的内存(12个点将使用1.8Gb)。

评论:

sub f {
    @g = map { $_<10 ? "0$_" : $_ } 0..$#_; # generate fixed-width path indices
    $" = ',';                               # set $LIST_SEPARATOR to comma for glob
    @l = grep {                             # only iterate paths with unique points
        "@g" eq join $", sort /../g         # compare sorted indices with unique indices
    } glob "{@g}" x (@i=@_);                # produce all permutations of path indices
                                            # and save @_ in @i for sub d
    map {
        @c = /../g;                         # unpack the path indices
        $s=0;                               # total path length
        $v=1;                               # validity flag
        for $k (1..$#c) {                   # iterate path
            $s +=                           # sum path length
                $D = d( $k-1, $k );         # line distance 

              $_!=$k && $_!=$k-1            # except for the current line,
              && $D == d( $_, $k )          # if the point is on the line,
                     + d( $_, $k-1 )
              and $v = 0                    # then reset it's validity
            for 0 .. $#c                    # iterate path again to check all points
        }
        $m=$s if $m<$s && $v                # update maximum path length
    } @l;
    $m                                      # return the max
}

sub d {                                     
    @a = @{ $i[$c[$_[0]]] };                # resolve the index $_[0] to the first coord
    @b = @{ $i[$c[$_[1]]] };                # idem for $_[1]
    sqrt( ($a[0] - $b[0])**2       
        + ($a[1] - $b[1])**2 )      
}

测试用例:

print f( [0,1], [0,0], [1,0] ), $/;        $m=0; # reset max for next call
print f( [0,0], [0,1], [1,0], [1,1] ), $/; $m=0;
print f( [0,0], [0,1], [0,2] ), $/;        $m=0;
print f( [0,0], [0,1], [0,2], 
         [1,0], [1,1], [1,2]),$/;          $m=0;
  • 322个字节:通过不重置$"和一些内联来保存19 个字节
  • 318字节:通过将坐标的最大nr减小为100,保存4。
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.