将方形网格划分为相等面积的部分


17

此挑战基于以下难题:给您一个nby n网格,其中带有n标记的单元格。您的工作是将网格划分为多个n部分,其中每个部分均由精确的n单元格组成,每个单元格仅包含一个标记的单元格。

这是左边的难题,右边是其(唯一)解决方案:

难题 解

挑战

您会n以任何合理的格式获得一组零索引的坐标。

[(0,0), (0,3), (1,0), (1,1), (2,2)]

您的工作是编写一个返回任何有效分区(同样,以任何合理的格式)的程序。

[
  [(0,0), (0,1), (0,2), (1,2), (1,3)],
  [(0,3), (0,4), (1,4), (2,4), (3,4)],
  [(1,0), (2,0), (3,0), (4,0), (4,1)],
  [(1,1), (2,1), (3,1), (3,2), (4,2)],
  [(2,2), (2,3), (3,3), (4,3), (4,4)]
]

如果难题没有解决方案,程序应通过抛出错误或返回空解决方案来表明这一点。

输入/输出示例

[(0,0)]               => [[(0,0)]]

[(0,0), (1,1)]        => [
                          [(0,0), (1,0)], 
                          [(0,1), (1,1)]
                         ]

[(0,0), (0,1), (1,0)] => [] (no solution)

[(0,0), (0,1), (0,2)] => [
                          [(0,0), (1,0), (2,0)], 
                          [(0,1), (1,1), (2,1)],
                          [(0,2), (1,2), (2,2)],
                         ]

[(0,0), (0,2), (1,2)] => [
                          [(0,0), (1,0), (2,0)], 
                          [(0,1), (0,2), (1,1)],
                          [(1,2), (2,1), (2,2)],
                         ]

计分

这是,因此最短的代码获胜。



@Arnauld,对于Shikaku拼图来说,“目标是将网格划分为矩形和正方形”。在这种情况下,没有这种约束。
彼得·卡吉

对困惑感到抱歉。我认为沙盒中的某个地方可能会有Shikaku挑战,或者也许我正计划在某个时候让自己成为一个我-我不记得了。无论哪种方式,我乍一看都认为是同一回事。
Arnauld,

为什么结果是二维坐标数组?我不明白那里表达的是什么……难道它不是数组索引的二维数组吗?例如,第3行第2列包含索引为4的分区。
奥利维尔·格雷戈尔(OlivierGrégoire),

如示例所示,我们是否可以假定可以从参考坐标开始绘制每个区域?我刚刚意识到,我已经在不知不觉中将其视为理所当然。
Arnauld

Answers:


11

JavaScript(ES7),166个字节

F一种sË

a=>(m=a.map(_=>[...a]),g=(n,X,Y,j=0,i)=>a[n]?a[j]?m.some((r,y)=>r.some((v,x)=>++v|(X-x)**2+(Y-y)**2-1?0:g(r[x]=n,x,y,j+1,i|x+[,y]==a[n])?1:r[x]=v)):i&&g(n+1):1)(0)&&m

在线尝试!

怎么样?

ñ×ññ

m = a.map(_ => [...a])

ñ++

GñXÿĴ一世

g = (n, X, Y, j = 0, i) => a[n] ? a[j] ? ... : i && g(n + 1) : 1

一种[ñ]一种[Ĵ]

G

m.some((r, y) =>          // for each row r[] at position y in m[]:
  r.some((v, x) =>        //   for each cell of value v at position x in r[]:
    ++v |                 //     if this cell is already filled (i.e. v is numeric)
    (X - x) ** 2 +        //     or the squared Euclidean distance between
    (Y - y) ** 2 -        //     (X, Y) and (x, y)
    1 ?                   //     is not equal to 1:
      0                   //       this is an invalid target square: do nothing
    :                     //     else:
      g(                  //       do a recursive call to g:
        r[x] = n,         //         pass n unchanged and fill the cell with n
        x, y,             //         pass the coordinates of the current cell
        j + 1,            //         increment j
        i |               //         update i:
        x + [,y] == a[n]  //         set it if (x, y) = a[n]
      ) ?                 //       if the result of the call is truthy:
        1                 //         return 1
      :                   //       else:
        r[x] = v          //         reset the cell to NaN
  )                       //   end of inner map()
)                         // end of outer map()
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.