Javascript Q:二维网格上多个不相等形状的排列

Javascript Q:二维网格上多个不相等形状的排列,javascript,r,permutation,algebra,Javascript,R,Permutation,Algebra,情况: 此问题存在以下组件: 二维矩形网格(“r”行乘以“c”列) 一个或多个形状:此处形状定义为一条直线,该直线是一段长度为“L”的相邻段。每个线段的大小相当于网格的一个单元 目标: 代数计算所有形状可以同时排列在网格上的唯一方式(排列)的总数 最终,我将在R或JavaScript中使用此函数;然而,这主要是一个数学/代数问题。只要我了解解决方案的工作原理,我愿意将提供的任何解决方案转换为适当的语言。欢迎并欣赏所有想法/语言 标准: 所有形状必须同时(完全)适合网格 形状不能重叠。一次只

情况:

此问题存在以下组件:

  • 二维矩形网格(“r”行乘以“c”列)
  • 一个或多个形状:此处形状定义为一条直线,该直线是一段长度为“L”的相邻段。每个线段的大小相当于网格的一个单元
目标:

代数计算所有形状可以同时排列在网格上的唯一方式(排列)的总数

最终,我将在R或JavaScript中使用此函数;然而,这主要是一个数学/代数问题。只要我了解解决方案的工作原理,我愿意将提供的任何解决方案转换为适当的语言。欢迎并欣赏所有想法/语言

标准:

  • 所有形状必须同时(完全)适合网格
  • 形状不能重叠。一次只能有一段占用网格单元
  • 形状可以垂直放置
  • 形状可以水平放置
  • 形状不能对角放置
  • 形状必须保持完整(即,两段形状不能拆分为两段、一段形状)
背景:

如果每个形状都有一个单独的段(即,仅占用网格的一个单元),则可以使用阶乘:

Let x = r * c (the number of cells in the grid)
Let n = the number of single-segment shapes to fit on the grid

P(x,n) = x! / (x-n)!
因此,三行三列网格上两个单段形状的排列可计算为:

P((3*3),2) = 9!/(9-2)! = 72
P(3,3,2) = 3*(3-(2-1)) + 3*(3-(2-1)) = 12
相对简单优雅

计算长度为L>=1(需要L)的单个形状的置换
P(3,3,2) = 3*(3-(2-1)) + 3*(3-(2-1)) = 12