有一个矩形的硬币网格,其中头部由数值1表示,尾部由数值0表示。您使用2D整数数组表格(1到10行/包括列)。硬币翻转游戏:优化问题
在每次移动中,您在网格(第R行,第C列)中选择任意单个单元格(R,C)并翻转所有单元格中的硬币(r,c),其中r在0和R(含),并且c在0和C之间,包括端值。翻转硬币意味着将单元格的值从零反转为一或一到零。
返回将网格中的所有单元格更改为尾部所需的最小移动次数。这将永远是可能的。
例子:
1111
1111
returns: 1
01
01
returns: 2
010101011010000101010101
returns: 20
000
000
001
011
returns: 6
这是我的尝试: 由于翻转的顺序并不重要,并作出此举在硬币上两次不一样作出动弹,我们只要找到所有不同的翻转硬币组合,并最大限度地减少好组合的大小(好的含义是那些能够提供所有尾巴的组合)。
这可以通过制作一个由所有硬币组成的集合来完成,每一个硬币都由一个索引表示(即如果共有20个硬币,这个集合将包含20个元素,给它们索引1至20)。然后制作所有可能的子集,并查看其中哪些给出了答案(即,如果在子集中的硬币上移动给我们所有的尾部)。最后,尽量减少组合的大小。
我不知道我是否能够清楚地表达自己......如果需要,我会发布代码。 无论如何,这种方法太耗费时间和浪费,并且不可能用于大于20的硬币(在我的代码中)。 如何解决这个问题?
有没有更好的方法来实现这个?我只是想尝试'valarray',因为我从来没有用过它,而且我很惊讶我必须为每一次移动构建一个全新的1 ... – Potatoswatter 2010-08-27 21:25:23
哇......没想到问题可以减少,例如一个简单的。非常感谢!! (虽然Brian的实现更容易理解,但那可能是因为我不知道valarray是什么:P} – 2010-08-30 06:31:39
@Arpit:我也更容易理解,因为它是伪代码。我甚至懒得提供实现 – Brian 2010-08-30 14:02:51