回溯数据并保存列表

时间:2017-03-23 09:15:27

标签: python backtracking sudoku

我想使用回溯保存所有可能的数独答案 但增加的答案就像数独问题一样。 但是当我在附加“alist”时打印“网格”时它很好。我该如何解决这个问题?

def backtrack(grid,x,y,alist):
    if x == 9:

        alist.append(grid)
        print(grid)
        return alist

    v = grid[x][y]

    if v == 0:
        for i in range(1,10):

            check = True
            if i in grid[x]:
                check = False
                continue
            for row in range(0,9):
                if i == grid[row][y]:
                    check = False
                    continue

            for row in range(3*(x//3),3*(x//3)+3):
                for col in range(3*(y//3),3*(y//3)+3):
                    if i == grid[row][col]:
                        check = False
                        continue
            if check == True:
                grid[x][y]= i
                if y < 8:
                    backtrack(grid,x,y+1,alist)

                else:
                    backtrack(grid,x+1,0,alist)
        grid[x][y] = 0
        return alist
    else:
        if y< 8:
            backtrack(grid,x,y+1,alist)
        else:
            backtrack(grid,x+1,0,alist)

        return alist


problem = [[4, 0, 3, 0, 2, 0, 6, 0, 0],
                          [9, 6, 0, 3, 0, 0, 0, 0, 0],
                          [2, 0, 1, 8, 0, 6, 0, 9, 0],
                          [0, 0, 8, 1, 0, 2, 9, 0, 0],
                          [7, 2, 0, 0, 6, 0, 0, 0, 8],
                          [0, 0, 6, 7, 0, 8, 2, 0, 0],
                          [0, 0, 2, 6, 0, 9, 5, 0, 0],
                          [8, 0, 0, 2, 0, 3, 0, 0, 9],
                          [0, 0, 5, 0, 1, 0, 3, 0, 0]]
alist = []
for a in backtrack(problem,0,0,alist):
    print(a)

2 个答案:

答案 0 :(得分:0)

取代评论:

您使用&#39;继续&#39;很奇怪,

public function index(Request $request){
    $category = $request->input('category');

    //now get all user and services in one go without looping using eager loading
    //In your foreach() loop, if you have 1000 users you will make 1000 queries

    $users = User::with('services', function($query) use ($category) {
         $query->where('category', 'LIKE', '%' . $category . '%');
    })->get();

    return view('browse.index', compact('users'));
}

我认为在很多情况下,这意味着你会继续前进

        if i in grid[x]:
            check = False
            continue  # here we break out to the next value of i
        for row in range(0,9):
            if i == grid[row][y]:
                check = False
                continue  # here we move to the next value of 'row' 
                          # which we would do anyway

之前你想要。

我唯一的另一个评论是你的功能返回&#39; alist&#39;但是在递归中你从不使用那个值(也许你依赖追加?它对我来说不清楚)

答案 1 :(得分:0)

我正在添加第二个答案,因为我现在确实发现了问题。虽然我坚持我之前的评论,你对继续的使用是奇怪的。

考虑你的变量grid,因为这是一个对象的python,当你找到一个解决方案时,grid追加到alist,但因为python列表是可变的(我认为这是右边的术语)当你稍后调用grid[x][y] = 0时,你改变了对象网格,这是在alist的第一个位置引用的。

试试这段代码:

grid = [[4, 0, 3, 0, 2, 0, 6, 0, 0],
                      [9, 6, 0, 3, 0, 0, 0, 0, 0],
                      [2, 0, 1, 8, 0, 6, 0, 9, 0],
                      [0, 0, 8, 1, 0, 2, 9, 0, 0],
                      [7, 2, 0, 0, 6, 0, 0, 0, 8],
                      [0, 0, 6, 7, 0, 8, 2, 0, 0],
                      [0, 0, 2, 6, 0, 9, 5, 0, 0],
                      [8, 0, 0, 2, 0, 3, 0, 0, 9],
                      [0, 0, 5, 0, 1, 0, 3, 0, 0]]

alist = [grid, grid, grid]

grid[0][0] = "hello"
print alist

alist中的每个网格都已被修改。

相反,您可以创建网格对象的副本并将该副本附加到您的列表,请参阅How to clone or copy a list?以获取选项。例如:

import copy

...

...alist.append(copy.deepcopy(grid))

copy.copy似乎不起作用,可能是因为您使用带有列表的列表,而不是使用numpy数组或类似的东西。