有一個矩形的硬幣網格,其中頭部由數值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