Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何才能找到适合给定平方的最小可能平方数_C_Algorithm_Math - Fatal编程技术网

C 如何才能找到适合给定平方的最小可能平方数

C 如何才能找到适合给定平方的最小可能平方数,c,algorithm,math,C,Algorithm,Math,假设我有一个7x7的正方形。我可以用其他正方形(即尺寸为1x1,2x2….6x6的正方形)填充正方形。如何用最小可能的较小正方形填充正方形。请帮助我。考虑一个尺寸为s x s的正方形。将尺寸的较小正方形m x m切出,将产生m x m的正方形、n x n的正方形和两个尺寸的矩形m x n,其中m+n=s 当s为偶数时,可以将正方形分割为m=n,在这种情况下,矩形也将为正方形,结果为4 但是,当s为奇数时,必须选择m和n的值,以便生成的矩形可以用尽可能少的正方形填充。似乎没有一种显而易见的方法可以

假设我有一个7x7的正方形。我可以用其他正方形(即尺寸为1x1,2x2….6x6的正方形)填充正方形。如何用最小可能的较小正方形填充正方形。请帮助我。

考虑一个尺寸为
s x s
的正方形。将尺寸的较小正方形
m x m
切出,将产生
m x m
的正方形、
n x n
的正方形和两个尺寸的矩形
m x n
,其中
m+n=s

s
为偶数时,可以将正方形分割为
m=n
,在这种情况下,矩形也将为正方形,结果为4


但是,当
s
为奇数时,必须选择
m
n
的值,以便生成的矩形可以用尽可能少的正方形填充。似乎没有一种显而易见的方法可以立即找出最佳配置,因此我建议提出一种算法来计算最小的正方形数,可以用来填充一个大小为
mxn
的矩形(这是一个稍微简单的问题,我相信可以用递归算法来解决)。所需的方块总数将等于
2x([矩形中的方块数]+1)
。您可以使用循环检查
1
s/2
之间的所有m大小


希望这能让你开始。

考虑一个尺寸为s x s的正方形。 将
s
分解为素数。然后解决每个素数
sp
的问题。
sp x sp
的答案与
s x s
的答案相同。最小的素数很可能给出最低的结果。我没有这方面的证据,但我已经亲自检查了17 x 17。 这是对Otaias的偶数
s
概念的概括,得到了4的答案

Placing算法:

您需要从n=(s+1)/2向下舍入到n=s-1进行循环

把n x n正方形放在角落里

设m=s-n。 将m x m正方形放置在相邻的角落,并继续放置,直到它们(几乎)到达n x n正方形的末端

剩余的空间将是m x m(如果你幸运的话),或者最多2m-1 x 2m-1,并且缺少一个角块

用类似的算法填充剩余的空间。首先,在缺失角件的对面角放置一个n2 x n2正方形

通过手工操作,我获得了以下结果:

s  minimum number of squares:
2   4
3   6
5   8
7   9
11  10
13  11
17  12

首先检查n是否为偶数。如果n是偶数,那么答案是4,因为没有一种方法可以将3个或2个正方形拟合在一起形成另一个正方形,从而解决所有可能情况的一半

继续之前:此方法不完整,可能是错误的方法 我只是想抛出一个开箱即用的想法,因为我觉得这可能会有所帮助,并希望能推进问题的解决。我觉得这可能和我的工作有一些关联。该算法可能太长,无法计算更大的值,而且我不确定会发生多少优化

现在我的想法是尝试枚举所有三元组
(n1,n2,n3)
,其中
n1+n2+n3=n
n1,n2,n3
都是素数(它们是>=2)和
n>=7
n1=7)和
(n31,n32,n33)
(将n视为n=n3,所以n3>=7)。下一步查找值,其中
n_s3==n_s4
,两者都是最大值。
例如:

让我们假设
x3=17
x4=13

  Enumeration of x3 = 17:
  2 + 2 + 13
  3 + 3 + 11
  5 + 5 + 7
  
  Enumeration of x_s3:
  4 = 2 + 2
  6 = 3 + 3
  10 = 5 + 5
  12 = 5 + 7
  14 = 3 + 11
  15 = 2 + 13
  
  Enumeration of x4 = 13:
  2 + 2 + 7
  3 + 5 + 5
  
  Enumeration of x_s4:
  4 = 2 + 2
  8 = 3 + 5
  9 = 2 + 7
  10 = 5 + 5
由于
10
是13和17之间共享的最大值,因此在(两个矩形)中拟合一个10×10的正方形,现在有一个非平行四边形,它越来越难以填充,但可能(我觉得)朝向正确的方向


感谢所有反馈。

这还不清楚。你能举个例子吗?看看whathaveyoutried.com和常见问题解答,如果我必须填充3X3的平方,那么我可以用9个1x1的平方或1个2X2和5个1x1来填充平方。因为第二个选项需要更少的方块数。同一位老师?:)不确定求解
mxn
更简单,因为
nxn
可以被视为它的特例。“所需的总平方数将等于2x([mxn矩形中的平方数]+1)。”这不是真的!考虑n=4,m=3。您建议将3x3放置在4x4的对面,需要10个较小的正方形,这不是最佳选择。将2x2放在相对的拐角处可将所需的数字削减至9。我认为最好先在nxn的相邻角落放置mxm正方形。嗯,你说得对。这个问题比我想象的要复杂。你的结果似乎不对(你不能用5个正方形覆盖一个3x3的正方形)。即使你解决了这个问题,我也不明白为什么你认为你的算法是最优的。我理解正确,它甚至没有完全指定:重复这个过程两次后,你会得到一个缺了两个角的正方形,并且不清楚如何从那里继续…@interjay抱歉,错别字,3x3应该是6。你是对的,我的答案并不完整。这是我在很短的时间内所能想到的。我希望其他人会发现它很有希望,并帮助进一步改进它。如果你想在一段合理的时间内解决这类问题,那么每一点可以减少必要暴力的信息都是有帮助的。
  Enumeration of x3 = 17:
  2 + 2 + 13
  3 + 3 + 11
  5 + 5 + 7
  
  Enumeration of x_s3:
  4 = 2 + 2
  6 = 3 + 3
  10 = 5 + 5
  12 = 5 + 7
  14 = 3 + 11
  15 = 2 + 13
  
  Enumeration of x4 = 13:
  2 + 2 + 7
  3 + 5 + 5
  
  Enumeration of x_s4:
  4 = 2 + 2
  8 = 3 + 5
  9 = 2 + 7
  10 = 5 + 5