Python程序随机挂起

时间:2019-05-26 13:56:14

标签: python-3.x

我是python的新手,因此我正在创建此项目以使用蛮力方法创建Sudoku。在某种程度上我是成功的,但我无法弄清楚为什么有时程序在生成时会随机挂起。希望有人能找出问题所在。

我尝试调试代码,但仍然无法查明是什么原因导致了问题。我最想弄清楚该错误的原因是它是在brute_generator()函数的某个地方引起的。

有关代码如何工作的一些信息:-

通过调用9次brute_generator()函数,逐行生成数独。

在函数brute_generator()中,行是使用反复试验生成的,其中从数字1-9的可能性列表中选取一个随机数,然后将其视为第一个行数,现在为{{调用1}}和check_1()函数来检查数字是否已经在前一行的列中重复(如果有的话)以及根据Sudoku规则的 3x3 平方,如果是,则该号码将被添加到黑名单列表中,并选择另一个号码,直到获得正确的号码为止。当获得正确的数字时,它会被添加到check_2()上,同时又从可能性列表中删除,因此无法再次选择它,并且计数器将增加1。重复执行直到生成该行(即temp_array)或不能将可能性列表中的任何数字放置到该行的给定单元格中(即counter = 9,所有可能性都被列入黑名单),在这种情况下,将生成该行通过将所有变量恢复为默认值来抓取,并生成新行。这会一直进行到获得完美的行,然后将其附加到len(blacklist)==len(possibilities)

sudoku_array()

程序卡住后,Traceback调用将显示以下内容

def check_1(x , temp_array ,  sudoku_array) :  # Check for recurrence in the Block in which the cell exist
    flag_1 = True
    if len(temp_array) < 3 :
        j = 2
        l = 0
    elif len(temp_array) < 6 :
        j = 5
        l = 3
    else :
        j = 8
        l = 6
    i = len(sudoku_array)
    if len(sudoku_array) < 3 :
        o = 0
    elif len(sudoku_array) < 6 :
        o = 3
    else :
        o = 6
    for m in range(o,i) :
        for n in range(l,j+1) :
            if x == sudoku_array[m][n] :
                flag_1 = False
                break
        if x == sudoku_array[m][n] :
            break
    return flag_1



def check_2(x, counter, sudoku_array) :  # Check for the recurrence of number in its consequent column
    flag_2 = True
    for k in range(len(sudoku_array)) :
        if x == sudoku_array[k][counter] :
            flag_2 = False
            break
    return flag_2



def brute_generator(sudoku_array) : # The main sudoku Generating Algo.
    all_possibilities = [1,2,3,4,5,6,7,8,9]
    possibilities = all_possibilities.copy()
    blacklist = []
    counter = 0
    temp_array = []
    while counter != 9 :
        if len(blacklist) == len(possibilities) :
            all_possibilities = [1,2,3,4,5,6,7,8,9]
            possibilities = all_possibilities.copy()
            blacklist = []
            counter = 0
            temp_array = []
            continue
        x = random.choice(possibilities)
        if x not in blacklist :
            if len(sudoku_array) != 0 :
                if check_1(x, temp_array , sudoku_array) == False :
                    blacklist.append(x)
                    continue
                elif check_2(x, counter , sudoku_array) == False :
                    blacklist.append(x)
                    continue
            possibilities.remove(x)
            counter+=1
            temp_array.append(x)
            blacklist = []
    sudoku_array.append(temp_array)


sudoku_array = []   # This will be the generated sudoku
for i in range(9) :
    brute_generator(sudoku_array)

1 个答案:

答案 0 :(得分:0)

  

希望有人可以指出问题所在。

问题是for i in range(9) : brute_generator(sudoku_array)可以创建部分sudoku_array,这是不可能完成的,例如。 G。五行:

[1, 5, 7, 2, 3, 6, 8, 4, 9],
[9, 8, 2, 5, 4, 7, 6, 3, 1],
[4, 3, 6, 8, 1, 9, 7, 2, 5],
[5, 7, 9, 4, 2, 1, 3, 6, 8],
[6, 1, 3, 9, 5, 8, 2, 7, 4]

现在,该函数将继续搜索从未找到的合适的第六行,并且也不会回溯,这意味着将丢弃先前生成的行以摆脱死胡同。