微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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),每次您递归更深时递减,然后将其与布尔条件组合,例如,大约找到了(部分)解决方案(通常在这种问题上,解决方案验证是最容易的部分)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?