Python Sudoku Solver进入无限循环,如何限制函数中的循环次数?

问题描述

由于难题有许多解决方案,我有以下代码进入无限循环。

但是,我正在努力了解如何限制打印出的解决方案的数量而不影响函数的迭代方式。

我尝试在solve()函数内部使用一个while循环,但这没用。

import numpy as np

# Add the puzzle you want to solve here:
grid = [[0,3,4],[0,6,5],2,1],[3,4,0],[2,[6,5,0]
        ]


def possible(y,x,n):
    global grid
    for i in range(0,6):
        if grid[y][i] == n:
            return False

    for i in range(0,6):
        if grid[i][x] == n:
            return False

    x0 = (x//3)*3
    y0 = (y//3)*3

    for i in range(0,3):
        for j in range(0,3):
            if grid[y0+i][x0+j] == n:
                return False

    return True


print(np.matrix(grid))


def solve():
    global grid
    for y in range(6):
        for x in range(6):
            if grid[y][x] == 0:
                for n in range(1,10):
                    if possible(y,n):
                        grid[y][x] = n
                        solve()
                        grid[y][x] = 0
                return
    print(np.matrix(grid))

解决方法

每次调用solve()时,它将从第一个方框i,j = 0,0开始。因此,如果您的possible函数针对某些坐标返回False,则永远不要将值更改为不同于0的值,并且将永远停留在该特定框上。

如果您仍然想实现递归函数,则至少需要传递坐标ij作为参数。

,

我将在这里尝试为可能的方法进行推理。

对于possible()的正确性我不能说太多(这很重要,因为它可以正常工作,否则它可能是一个永不终止的算法)。另一方面,在我看来,假设possible()是正确的,则该算法具有上限(由于使用range()的循环)并且自给定的sudoku(即使没有线索)总是有一个有限的解集,那么您的算法应该总是终止。因此,最好对某些输入集有时间复杂度的期望。

一种可能的方法是限制递归深度(请参阅更多here),或者将参数传递给solve(limit=1000),每次您递归更深时递减,然后将其与布尔条件组合,例如,大约找到了(部分)解决方案(通常在这种问题上,解决方案验证是最容易的部分)。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...