【问题标题】:Why does my sudoku solution generator keeps giving the same solution?为什么我的数独解法生成器总是给出相同的解法?
【发布时间】:2021-09-20 04:44:09
【问题描述】:

代码应该是直截了当的,但我发现它有时运行良好,有时根本不运行。当尝试立即打印解决方案时它工作正常,但是当我尝试存储、使用或对它们做任何其他事情时,生成器只是一遍又一遍地提供相同的解决方案

def isvalid(grid,y,x,n): 
    for i in range(9):
        if i!=y and grid[i][x]==n:
            return False
        if i!=x and grid[y][i]==n:
            return False
    sy=3*(y//3)
    sx=3*(x//3)
    for dy in range(3) :
        for dx in range(3) :
            if sy+dy!=y and sx+dx!=x:
                if grid[sy+dy][sx+dx]==n: return False
    return True

def solve(grid):
    number_list = [1,2,3,4,5,6,7,8,9]
    for y in range(9):
        for x in range(9):
            if grid[y][x]==0:
                random.shuffle(number_list) 
                for i in number_list:
                    if isvalid(grid,y,x,i):
                        grid[y][x]=i
                        yield from solve(grid)
                        grid[y][x]=0
                return
    yield grid 

使用此代码,第一种情况可以正常工作并打印不同的网格 但在 #2 中,解决方案是相同的,结果是正确的

grid=[[0]*9 for x in range(9)]
s= solve(grid)
# 1
for i in s:
    print(i)
# 2
solutions=[]
for i,n in zip(s,range(3)):
    solutions.append(i)
print(solutions[0]==solutions[1])

【问题讨论】:

    标签: python generator backtracking sudoku


    【解决方案1】:

    您的代码使用单个可变数据结构grid,solve 函数在每一步都对其进行修改。每个yield grid 语句都只是简单地返回对该可变对象的引用,因此您收集的列表是对同一事物的引用列表,处于其最新状态。

    注意:您可以通过检查看到您的解决方案指向同一个对象:

    print(solutions[0] is solutions[1])
    

    尝试每次生成网格的深层副本(如果您想收集它们的列表),或者在生成网格时打印它们而不是收集它们(编辑:IIUC 您的打印方法#1 目前显示不同的解决方案正如预期的那样):

    yield [[entry for entry in row] for row in grid]
    

    这可能会占用大量内存,尤其是当您从一个空网格开始时。最好先用一个解决方案较少的示例进行测试。

    【讨论】:

    • 哦,真的谢谢我没有注意到这里...我认为我不会有内存问题,因为我最多只能生成 3 个网格(解决方案),对吧?
    • 是的,如果您只捕获前 3 个,那应该不是问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 2013-03-22
    • 2019-06-14
    相关资源
    最近更新 更多