|
| 1 | +import tkinter as tk |
| 2 | + |
| 3 | +class SudokuSolverGUI: |
| 4 | + def __init__(self, master): |
| 5 | + self.master = master |
| 6 | + self.master.title("Sudoku Solver") |
| 7 | + self.board = [[0 for _ in range(9)] for _ in range(9)] |
| 8 | + self.input_sudoku() |
| 9 | + self.create_widgets() |
| 10 | + |
| 11 | + def input_sudoku(self): |
| 12 | + print("Enter the Sudoku puzzle values row by row:") |
| 13 | + for i in range(9): |
| 14 | + row_input = input().split() |
| 15 | + for j in range(9): |
| 16 | + self.board[i][j] = int(row_input[j]) |
| 17 | + |
| 18 | + def create_widgets(self): |
| 19 | + self.canvas = tk.Canvas(self.master, width=450, height=450, bg="white") |
| 20 | + self.canvas.pack() |
| 21 | + |
| 22 | + for i in range(10): |
| 23 | + line_width = 2 if i % 3 == 0 else 1 |
| 24 | + self.canvas.create_line(50 * i, 0, 50 * i, 450, width=line_width) |
| 25 | + self.canvas.create_line(0, 50 * i, 450, 50 * i, width=line_width) |
| 26 | + |
| 27 | + for i in range(9): |
| 28 | + for j in range(9): |
| 29 | + value = self.board[i][j] |
| 30 | + if value != 0: |
| 31 | + x, y = j * 50 + 25, i * 50 + 25 |
| 32 | + self.canvas.create_text(x, y, text=str(value), font=("Arial", 14, "bold")) |
| 33 | + |
| 34 | + self.solve_button = tk.Button(self.master, text="Solve", command=self.solve_sudoku) |
| 35 | + self.solve_button.pack() |
| 36 | + |
| 37 | + def solve_sudoku(self): |
| 38 | + self.solve_button.config(state="disabled") |
| 39 | + self.solve() |
| 40 | + |
| 41 | + def solve(self): |
| 42 | + empty_cell = self.find_empty_cell() |
| 43 | + if not empty_cell: |
| 44 | + self.solve_button.config(state="normal") |
| 45 | + return True |
| 46 | + |
| 47 | + row, col = empty_cell |
| 48 | + for num in range(1, 10): |
| 49 | + if self.is_valid_move(num, row, col): |
| 50 | + self.board[row][col] = num |
| 51 | + self.update_cell(row, col, num) |
| 52 | + if self.solve(): |
| 53 | + return True |
| 54 | + self.board[row][col] = 0 |
| 55 | + self.update_cell(row, col, 0) |
| 56 | + return False |
| 57 | + |
| 58 | + def find_empty_cell(self): |
| 59 | + for i in range(9): |
| 60 | + for j in range(9): |
| 61 | + if self.board[i][j] == 0: |
| 62 | + return i, j |
| 63 | + return None |
| 64 | + |
| 65 | + def is_valid_move(self, num, row, col): |
| 66 | + for i in range(9): |
| 67 | + if self.board[row][i] == num or self.board[i][col] == num: |
| 68 | + return False |
| 69 | + start_row, start_col = 3 * (row // 3), 3 * (col // 3) |
| 70 | + for i in range(start_row, start_row + 3): |
| 71 | + for j in range(start_col, start_col + 3): |
| 72 | + if self.board[i][j] == num: |
| 73 | + return False |
| 74 | + return True |
| 75 | + |
| 76 | + def update_cell(self, row, col, num): |
| 77 | + x, y = col * 50 + 25, row * 50 + 25 |
| 78 | + self.canvas.delete(f"number_{row}_{col}") |
| 79 | + if num != 0: |
| 80 | + self.canvas.create_text(x, y, text=str(num), font=("Arial", 14, "bold"), tags=f"number_{row}_{col}") |
| 81 | + |
| 82 | +def main(): |
| 83 | + root = tk.Tk() |
| 84 | + app = SudokuSolverGUI(root) |
| 85 | + root.mainloop() |
| 86 | + |
| 87 | +if __name__ == "__main__": |
| 88 | + main() |
0 commit comments