甲KENKEN難題是拉丁方分成邊連接域:一個單一的單元中,同一行或列內的兩個相鄰的單元,佈置成一排或在三個小區等等。每個域都有一個標籤,它給出一個目標編號和一個算術運算(+ - * /),該運算將應用於域中單元格中的數字以產生目標編號。 (如果域只有一個單元格,就沒有給定操作符,只是一個目標---正方形爲你解決,如果操作符是 - 或/,那麼域中只有兩個單元格)。難題是(重新)構建與領域邊界和標籤一致的拉丁廣場。 (我認爲我已經看到與非唯一解一個謎一次。)查找KENKEN益智「乘法」的所有可能的因素域
在細胞的數目的範圍可以從1到拼圖的寬度(高度);通常,謎題是一側有4或6個細胞,但考慮任何尺寸的謎題。已發佈的謎題(4x4或6x6)中的域通常不超過5個單元格,但同樣,這似乎不是硬性限制。 (然而,如果謎題只有一個域名,那麼將會有與該維度的拉丁方塊一樣多的解決方案...)
編寫KenKen解算器的第一步是創建可以生成首先忽略域的幾何形狀,可能的數字組合在任何域中。 (一個線性域,就像一行三個單元一樣,在解決的難題中不能有重複的數字,但我們暫時忽略它)。我已經能夠編寫一個Python函數來處理添加標籤的情況:給它拼圖的寬度,域中單元的數量以及目標總和,並且它返回一個有效數字的元組列表,並加入到目標中。
乘法情況避開了我。我可以得到一個字典,其中的密鑰等於在給定大小的謎題中可達到的產品的產品,其中的值是包含提供該產品的因素的元組列表,但我無法制定出案例逐個例程,甚至不是一個壞例程。
分解一個給定的產品爲素數似乎很容易,但隨後劃分素數列表爲因素樹樁我的期望數量。 (我已經在Knuth的TAOCP的第4卷的第3部分中進行了思考,但是我還沒有學會如何「理解」他的算法描述,所以我不知道他的集合分割算法是否是一個起點。瞭解Knuth的描述可能是另一個問題!)
我很樂意預先計算普通域和拼圖大小的「多個」字典,只是將加載時間記入開銷,但這種方法似乎並不是一種有效的方式來處理,比如說,拼圖100側的細胞和2到50個細胞的大小的域。
對於KENKEN困惑的一些例子,看看http://www.nytimes.com/ref/crosswords/kenken.html – 2009-06-06 01:06:40