# this is 9*9 Sudoku

grid = []
grid.append([3, 0, 6, 5, 0, 8, 4, 0, 0])
grid.append([5, 2, 0, 0, 0, 0, 0, 0, 0])
grid.append([0, 8, 7, 0, 0, 0, 0, 3, 1])
grid.append([0, 0, 3, 0, 1, 0, 0, 8, 0])
grid.append([9, 0, 0, 8, 6, 3, 0, 0, 5])
grid.append([0, 5, 0, 0, 9, 0, 6, 0, 0])
grid.append([1, 3, 0, 0, 0, 0, 2, 5, 0])
grid.append([0, 0, 0, 0, 0, 0, 0, 7, 4])
grid.append([0, 0, 5, 2, 0, 6, 3, 0, 0])

  
import turtle
t = turtle.Turtle()
t.speed(40)

def f(k):
  return -250+50*k

def draw_grid():
  for k in range(10):
    if k%3 == 0:
      t.color('red')
      t.penup()
      t.goto(f(k),200)
      t.pendown()
      t.goto(f(k),-250)
    else:
      t.color('black')
      t.penup()
      t.goto(f(k),200)
      t.pendown()
      t.goto(f(k),-250)
 
  for k in range(10):
    if k%3 == 0:
      t.color('red')
      t.penup()
      t.goto(-250,f(k))
      t.pendown()
      t.goto(200,f(k))
    else:
      t.color('black')
      t.penup()
      t.goto(-250,f(k))
      t.pendown()
      t.goto(200,f(k))
  
  row = 0
  column = 0
  t.color('black')
  for row in range(9):
    for column in range(9):
      t.penup()
      t.goto(f(column+0.35),f(8-row + 0.35))
      t.pendown()
      if grid[row][column] != 0:
       t.write(grid[row][column], font=("Arial", 16, "normal"))
      
def empty_squares(grid):
  row = 0
  column = 0
  empty = []
  for row in range(9):
    for column in range(9):
      if grid[row][column] == 0:
        empty.append([row,column])
  return empty
      
draw_grid()
empty = empty_squares(grid)
print(empty)

#return True if the number not in the row of the grid
def number_not_in_row(grid, row, number):
  for column in range(9):
    if number == grid[row][column] == number:
      return False
  return True
print(number_not_in_row(grid, 0, 8))

#return True if the number not in the column of the grid
def number_not_in_column(grid, column, number):
  for row in range(9):
    if number == grid[row][column] == number:
      return False
  return True
print(number_not_in_column(grid, 0, 3))
print(number_not_in_column(grid, 0, 8))
  
#return True if the number not in the box[i,j] of the grid
# [0,0] [0,1]
# [1,0] [1,1]
def number_not_in_box(grid, box, number):
  for i in range(3):
    for j in range(3):
      if number == grid[box[0]*3+i][box[1]*3+j]:
        return False
  return True
print(number_not_in_box(grid, [0,0], 8))
print(number_not_in_box(grid, [0,0], 1))
      
#print(number_not_in_box(grid, [1,1], 2))

# input:feasible grid, an empty square, number
#return: True if the grid remains feasible if we write number in
# the empty square
def extend(grid, square, number):
  if number_not_in_row(grid, square[0], number):
    if  number_not_in_column(grid, square[1], number):
      if number_not_in_box(grid, [square[0]//3 ,square[1]//3], number):
        return True
  return False
  
#print(extend(grid, [1,2],3))

def sudoku(grid, empty):
  if len(empty) == 0:
    return True, grid
  square = empty.pop()
  for number in range(1,10):
    if extend(grid, square, number):
      grid[square[0]][square[1]] = number
      t.penup()
      t.color('black')
      t.goto(f(square[1]+0.35),f(8-square[0] + 0.35))
      t.pendown()
      t.write(number , font=("Arial", 16, "normal"))
      print(square,"in loop", number)
      solved, grid = sudoku(grid, empty)
      if solved:
        print("in_if_frame_solved")
        return True, grid
      else:
        print("in_if_frame_unsolved")
        t.penup()
        t.color('white')
        t.goto(f(square[1]+0.35),f(8-square[0] + 0.35))
        t.pendown()
        t.write(number , font=("Arial", 16, "normal"))
        grid[square[0]][square[1]] = 0
  empty.append(square)
  return False, grid
  
#print(empty) 
sudoku(grid, empty) 
#print(grid)
  
turtle.done()

 

posted on 2026-07-27 16:35  Rabbit_XIN  阅读(2)  评论(0)    收藏  举报