解決済みのsudokuパズルを解き放つPythonプログラムを作ろうとしています。これは、タイルの座標をランダムに生成し、そのタイルに既に数値が入っている場合は、再度試みます。それはそこに置くために1と9の間の数を生成し、その行、列、またはセクションにその数がまだなければ、値を割り当てて占有タイルのリストにその座標を追加します。すべてのタイルが塗りつぶされたら、ループを終了して完成したグリッドを返すことになっています。Python whileループが早く終了する
問題は、約70回のループの後にいつも停止するため、プログラムがフリーズすることです。ここで
は私が話している関数のコードです:
def populate(grid):
usedCoords = []
populated = False
while not populated:
x = random.randrange(len(grid))
y = random.randrange(len(grid))
while [x,y] in usedCoords:
x = random.randrange(len(grid))
y = random.randrange(len(grid))
value = random.randrange(1, len(grid) + 1)
if not rowCheck(grid, x, y, value) and not columnCheck(grid, x, y, value) and not squareCheck(grid, x, y, value):
grid[x][y] = value
usedCoords.append([x,y])
print(len(usedCoords))
if len(usedCoords) == len(grid) ** 2:
populated = True
return grid
そして、ここではそれを参照する関数のコードです:
def rowCheck(grid, x, y, value):
for i in range(len(grid)):
if not i == x:
if grid[i][y] == value:
return True
return False
def columnCheck(grid, x, y, value):
for i in range(len(grid)):
if not i==y:
if grid[x][i] == value:
return True
return False
def squareCheck(grid, x, y, value):
grid2 = [0] * (sectionSide) #new grid for the specific section
for i in range(len(grid2)):
grid2[i] = [0] * sectionSide
for i in range(x - (sectionSide - 1), x + sectionSide): #scanning only nearby coordinates
for j in range(y - (sectionSide - 1), y + sectionSide):
try:
if i // sectionSide == x // sectionSide and j // sectionSide == y // sectionSide:
grid2[i][j] = grid[x][y]
except IndexError:
pass
for i in range(len(grid2)):
for j in range(len(grid2[i])):
if grid2[i][j] == value and not (i == x and j == y):
return True
return False
あなたのループは、終了していないのではなく、早期に終了していますか? – Miles