簡體   English   中英

生成所有可能的 Kakuro 解決方案的字典

[英]Generate a dictionary of all possible Kakuro solutions

我剛從 Python 開始,並想嘗試為 Kakuro 拼圖生成所有可能解決方案的字典。 有一些關於這些謎題的帖子,但沒有一個顯示如何生成所述字典。 我所追求的是一個字典,它有 3-45 的鍵,它們的值是與鍵相加的整數的元組(例如 mydict[6] = ([1,5],[2,4] ,[1,2,3]))。 它本質上是一個子集和問題 - https://mathworld.wolfram.com/SubsetSumProblem.html

我自己有一個 go ,它可以處理長達三位數的元組。 我的方法需要為元組中每個額外的 integer 循環,所以需要我編寫一些非常重復的代碼嗎? 有沒有更好的方法來做到這一點,我覺得我想循環創建循環? 如果那是一件事?

def kakuro():
    L = [i for i in range(1,10)]
    mydict = {}
    for i in L:
        L1 = L[i:]
        for j in L1:
            if i+j in mydict:
                mydict[i+j].append((i,j))
            else:
                mydict[i+j] = [(i,j)]
            L2 = L[j:]
            for k in L2:
                if i+j+k in mydict:
                    mydict[i+j+k].append((i,j,k))
                else:
                    mydict[i+j+k] = [(i,j,k)]
    for i in sorted (mydict.keys()):
        print(i,mydict[i])
    return

我的第二輪嘗試——越來越好!

def kakurodict():
    from itertools import combinations as combs 
    L = [i for i in range(1,10)]
    mydict={}
    mydict2={}
    for i in L[1:]:
        mydict[i] = list(combs(L,i))
        for j in combs(L,i):
            val = sum(j)
            if val in mydict2:
                mydict2[val].append(j)
            else:
                mydict2[val] = [j]    
    return mydict2

因此,這是根據以下假設編寫的。

  • dict[n] 不能有值為 [n] 的列表。
  • 子集中的每個元素都必須是唯一的。

我希望其他人提供更好的解決方案,因為當我們為值 3-45 生成所有子集時,需要相當長的時間。 我相信子集和生成問題的時間復雜度是 2^n,所以如果 n 是 45,它並不理想。

import itertools

def subsetsums(max):
    if (max < 45):
        numbers = [x for x in range(1, max)]
    else:
        numbers = [x for x in range(1, 45)]

    result = [list(seq) for i in range(len(numbers), 0, -1) for seq in itertools.combinations(numbers, i) if sum(seq) == max]
    return(result)

mydict = {}
for i in range(3, 46):
    mydict[i] = subsetsums(i)

print(mydict)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM