我想使用回溯保存所有可能的数独答案 但增加的答案就像数独问题一样。 但是当我在附加“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)
答案 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数组或类似的东西。