我是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)
答案 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]
现在,该函数将继续搜索从未找到的合适的第六行,并且也不会回溯,这意味着将丢弃先前生成的行以摆脱死胡同。