def find_empty_location(arr, l):
for row in range(9):
for col in range(9):
if arr[row][col] == 0:
l[0] = row
l[1] = col
return True
return False
def used_in_row(arr, row, num):
for i in range(9):
if arr[row][i] == num:
return True
return False
def used_in_col(arr, col, num):
for i in range(9):
if arr[i][col] == num:
return True
return False
def used_in_box(arr, row, col, num):
for i in range(row // 3 * 3, row // 3 * 3 + 3):
for j in range(col // 3 * 3, col // 3 * 3 + 3):
if arr[i][j] == num:
return True
return False
def check_location_is_safe(arr, row, col, num):
return not used_in_row(arr, row, num) and not used_in_col(arr, col, num) and not used_in_box(arr, row, col, num)
def solve_sudoku(arr):
l = [0, 0]
if not find_empty_location(arr, l):
return True
row = l[0]
col = l[1]
for num in range(1, 10):
if check_location_is_safe(arr, row, col, num):
arr[row][col] = num
if solve_sudoku(arr):
return True
arr[row][col] = 0
return False
# 示例数独谜题
grid = [[3, 0, 6, 5, 0, 8, 4, 0, 0],
[5, 2, 0, 0, 0, 0, 0, 0, 0],
[0, 8, 7, 0, 0, 0, 0, 3, 1],
[0, 0, 3, 0, 1, 0, 0, 8, 0],
[9, 0, 0, 8, 6, 3, 0, 0, 5],
[0, 5, 0, 0, 9, 0, 6, 0, 0],
[1, 3, 0, 0, 0, 0, 2, 5, 0],
[0, 0, 0, 0, 0, 0, 0, 7, 4],
[0, 0, 5, 2, 0, 6, 3, 0, 0]]
if solve_sudoku(grid):
for i in range(9):
for j in range(9):
print(grid[i][j], end=' ')
print()
else:
print("No solution exists")
ZGVmIGZpbmRfZW1wdHlfbG9jYXRpb24oYXJyLCBsKToKICAgIGZvciByb3cgaW4gcmFuZ2UoOSk6CiAgICAgICAgZm9yIGNvbCBpbiByYW5nZSg5KToKICAgICAgICAgICAgaWYgYXJyW3Jvd11bY29sXSA9PSAwOgogICAgICAgICAgICAgICAgbFswXSA9IHJvdwogICAgICAgICAgICAgICAgbFsxXSA9IGNvbAogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgIHJldHVybiBGYWxzZQpkZWYgdXNlZF9pbl9yb3coYXJyLCByb3csIG51bSk6CiAgICBmb3IgaSBpbiByYW5nZSg5KToKICAgICAgICBpZiBhcnJbcm93XVtpXSA9PSBudW06CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICByZXR1cm4gRmFsc2UKZGVmIHVzZWRfaW5fY29sKGFyciwgY29sLCBudW0pOgogICAgZm9yIGkgaW4gcmFuZ2UoOSk6CiAgICAgICAgaWYgYXJyW2ldW2NvbF0gPT0gbnVtOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgcmV0dXJuIEZhbHNlCmRlZiB1c2VkX2luX2JveChhcnIsIHJvdywgY29sLCBudW0pOgogICAgZm9yIGkgaW4gcmFuZ2Uocm93IC8vIDMgKiAzLCByb3cgLy8gMyAqIDMgKyAzKToKICAgICAgICBmb3IgaiBpbiByYW5nZShjb2wgLy8gMyAqIDMsIGNvbCAvLyAzICogMyArIDMpOgogICAgICAgICAgICBpZiBhcnJbaV1bal0gPT0gbnVtOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgIHJldHVybiBGYWxzZQpkZWYgY2hlY2tfbG9jYXRpb25faXNfc2FmZShhcnIsIHJvdywgY29sLCBudW0pOgogICAgcmV0dXJuIG5vdCB1c2VkX2luX3JvdyhhcnIsIHJvdywgbnVtKSBhbmQgbm90IHVzZWRfaW5fY29sKGFyciwgY29sLCBudW0pIGFuZCBub3QgdXNlZF9pbl9ib3goYXJyLCByb3csIGNvbCwgbnVtKQpkZWYgc29sdmVfc3Vkb2t1KGFycik6CiAgICBsID0gWzAsIDBdCiAgICBpZiBub3QgZmluZF9lbXB0eV9sb2NhdGlvbihhcnIsIGwpOgogICAgICAgIHJldHVybiBUcnVlCiAgICByb3cgPSBsWzBdCiAgICBjb2wgPSBsWzFdCiAgICBmb3IgbnVtIGluIHJhbmdlKDEsIDEwKToKICAgICAgICBpZiBjaGVja19sb2NhdGlvbl9pc19zYWZlKGFyciwgcm93LCBjb2wsIG51bSk6CiAgICAgICAgICAgIGFycltyb3ddW2NvbF0gPSBudW0KICAgICAgICAgICAgaWYgc29sdmVfc3Vkb2t1KGFycik6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICAgICBhcnJbcm93XVtjb2xdID0gMAogICAgcmV0dXJuIEZhbHNlCiMg56S65L6L5pWw54us6LCc6aKYCmdyaWQgPSBbWzMsIDAsIDYsIDUsIDAsIDgsIDQsIDAsIDBdLAogICAgICAgIFs1LCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwXSwKICAgICAgICBbMCwgOCwgNywgMCwgMCwgMCwgMCwgMywgMV0sCiAgICAgICAgWzAsIDAsIDMsIDAsIDEsIDAsIDAsIDgsIDBdLAogICAgICAgIFs5LCAwLCAwLCA4LCA2LCAzLCAwLCAwLCA1XSwKICAgICAgICBbMCwgNSwgMCwgMCwgOSwgMCwgNiwgMCwgMF0sCiAgICAgICAgWzEsIDMsIDAsIDAsIDAsIDAsIDIsIDUsIDBdLAogICAgICAgIFswLCAwLCAwLCAwLCAwLCAwLCAwLCA3LCA0XSwKICAgICAgICBbMCwgMCwgNSwgMiwgMCwgNiwgMywgMCwgMF1dCgppZiBzb2x2ZV9zdWRva3UoZ3JpZCk6CiAgICBmb3IgaSBpbiByYW5nZSg5KToKICAgICAgICBmb3IgaiBpbiByYW5nZSg5KToKICAgICAgICAgICAgcHJpbnQoZ3JpZFtpXVtqXSwgZW5kPScgJykKICAgICAgICBwcmludCgpCmVsc2U6CiAgICBwcmludCgiTm8gc29sdXRpb24gZXhpc3RzIik=