目标是用Python创建一个9x9数独矩阵。
所以我走到了这一步。但我似乎不能让程序正确地处理内部或有方框。
def sudoku(size):
import random as rn
mydict = {}
n = 0
while len(mydict) < 9:
n += 1
x = range(1, size+1)
testlist = rn.sample(x, len(x))
isgood = True
for dictid,savedlist in mydict.items():
if isgood == False:
break
for v in savedlist:
if testlist[savedlist.index(v)] == v:
isgood = False
break
if isgood == True:
#print 'success', testlist
mydict[len(mydict)] = testlist
return mydict, n
return_dict, total_tries = sudoku(9)
for n,v in return_dict.items():
print n,v
print 'in',total_tries,'tries'
发布于 2017-08-04 00:59:58
这应该是可行的。
def sudoku(size):
import time
start_time=time.time()
import sys
import random as rn
mydict = {}
n = 0
print '--started calculating--'
while len(mydict) < 9:
n += 1
x = range(1, size+1)
testlist = rn.sample(x, len(x))
isgood = True
for dictid,savedlist in mydict.items():
if isgood == False:
break
for v in savedlist:
if testlist[savedlist.index(v)] == v:
isgood = False
break
if isgood == True:
isgoodafterduplicatecheck = True
mod = len(mydict) % 3
dsavedlists = {}
dtestlists = {}
dcombindedlists = {}
for a in range(1,mod + 1):
savedlist = mydict[len(mydict) - a]
for v1 in savedlist:
modsavedlists = (savedlist.index(v1) / 3) % 3
dsavedlists[len(dsavedlists)] = [modsavedlists,v1]
for t1 in testlist:
modtestlists = (testlist.index(t1) / 3) % 3
dtestlists[len(dtestlists)] = [modtestlists,t1]
for k,v2 in dsavedlists.items():
dcombindedlists[len(dcombindedlists)] = v2
dcombindedlists[len(dcombindedlists)] = dtestlists[k]
vsave = 0
lst1 = []
for k, vx in dcombindedlists.items():
vnew = vx[0]
if not vnew == vsave:
lst1 = []
lst1.append(vx[1])
else:
if vx[1] in lst1:
isgoodafterduplicatecheck = False
break
else:
lst1.append(vx[1])
vsave = vnew
if isgoodafterduplicatecheck == True:
mydict[len(mydict)] = testlist
print 'success found', len(mydict), 'row'
print '--finished calculating--'
total_time = time.time()-start_time
return mydict, n, total_time
return_dict, total_tries, amt_of_time = sudoku(9)
print ''
print '--printing output--'
for n,v in return_dict.items():
print n,v
print 'process took',total_tries,'tries in', round(amt_of_time,2), 'secs'
print '-------------------'
发布于 2021-10-06 18:01:26
这是我的解决方案
import random
def create_board(height, width):
board = [[(i + k) % 9 + 1 for i in range(1, height + 1)] for k in range(width)] # Creates a board where each row counts to 9 such that no row contains more than one kind of each number. You can run this separately to see what it generates.
random.shuffle(board) # Shuffles this list of lists
board = [[board[x][y] for x in range(9)] for y in range(9)] # Reads each row and puts it into a column. (basically rotates it to its side)
random.shuffle(board) # Shuffles this list again but while its on its side
return board
希望你们都喜欢。它不会删除数字,但可以在此函数中随机使用该函数后执行此操作
def remove_numbers(board, remove_amount):
h, w, r = len(board), len(board[0]), []
spaces = [[x, y] for x in range(h) for y in range(w)]
for k in range(remove_amount):
r = random.choice(spaces)
board[r[0]][r[1]] = 0
spaces.remove(r)
return board
发布于 2021-04-01 18:24:32
首先,随机创建一个完整的数独解决方案。这部分需要有数独解算器。
从数独解决方案中,不断删除随机位置上的数字。对于每次移除,请检查sudoku是否仍然有效。也就是说,数独有一个独特的解决方案。这部分需要找出是否有多个解决方案。这是数独解算器的另一个版本。
如果没有,我们放回号码并尝试另一个位置。该过程一直进行,直到所有位置都尝试过。
import random
import numpy as np
def PossibleValueAtPosition(pz:[], row:int, col:int):
r=row//3*3
c=col//3*3
return {1,2,3,4,5,6,7,8,9}.difference(set(pz[r:r+3,c:c+3].flat)).difference(set(pz[row,:])).difference(set(pz[:,col]))
def Solution_Count(pz:[], n:int, Nof_solution:int):
if Nof_solution>1:
return Nof_solution
if n>=81:
Nof_solution+=1
return Nof_solution
(row,col) = divmod(n,9)
if pz[row][col]>0:
Nof_solution = Solution_Count(pz, n+1, Nof_solution)
else:
l = PossibleValueAtPosition(pz, row,col)
for v in l:
pz[row][col] = v
Nof_solution = Solution_Count(pz, n+1, Nof_solution)
pz[row][col] = 0
return Nof_solution
def SudokuSolver(pz:[], n:int):
if n==81:
return True
(row,col) = divmod(n,9)
if pz[row][col]>0:
if SudokuSolver(pz, n+1):
return True
else:
l = list(PossibleValueAtPosition(pz, row,col))
random.shuffle(l)
for v in l:
pz[row][col] = v
if SudokuSolver(pz, n+1):
return True
pz[row][col] = 0
return False
def DigHoles(pz:[], randomlist:[], n:int, nof_holes:int):
if n>=81 or nof_holes>=64:
return
(row,col) = divmod(randomlist[n],9)
if pz[row][col]>0:
pz_check=pz.copy()
pz_check[row][col]=0
Nof_solution = Solution_Count(pz_check, 0, 0)
if Nof_solution==1:
pz[row][col]=0
nof_holes+=1
print(pz)
print("{} zeros".format(nof_holes))
print()
DigHoles(pz, randomlist, n+1, nof_holes)
def main():
puzzle = np.zeros((9,9), dtype=int)
SudokuSolver(puzzle, 0)
print(puzzle, "--------- Answer\n")
randomlist = list(range(81))
random.shuffle(randomlist)
DigHoles(puzzle, randomlist, 0, 0)
if __name__ == "__main__":
main()
https://stackoverflow.com/questions/45471152
复制相似问题