ravim254 commited on
Commit
a0e2f98
·
verified ·
1 Parent(s): 19b3ced

Upload 3 files

Browse files
Files changed (3) hide show
  1. app.py +26 -0
  2. requirements.txt +1 -0
  3. sudoku_solver.py +153 -0
app.py ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ from sudoku_solver import SudokuSolver
3
+
4
+ def solve_sudoku(input_text):
5
+ try:
6
+ flat = [int(c) for c in input_text if c.isdigit()]
7
+ if len(flat) != 81:
8
+ return "Please enter exactly 81 digits (0 for blanks)"
9
+ grid = [flat[i*9:(i+1)*9] for i in range(9)]
10
+
11
+ solver = SudokuSolver(grid)
12
+ solver.solve_logic()
13
+ solver.solve_backtracking()
14
+
15
+ output = '\n'.join(' '.join(str(n) for n in row) for row in solver.grid)
16
+ return output
17
+ except Exception as e:
18
+ return f"Error: {e}"
19
+
20
+ gr.Interface(
21
+ fn=solve_sudoku,
22
+ inputs=gr.Textbox(lines=9, label="Enter 81 digits (0 = blank)", placeholder="e.g.\n003000010\n060204070\n..."),
23
+ outputs=gr.Textbox(label="Solved Sudoku Grid"),
24
+ title="Sudoku Solver (Logic + Backtracking)",
25
+ description="Enter 81 digits (0 for blanks). Solver first applies logic, then backtracking."
26
+ ).launch()
requirements.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ gradio
sudoku_solver.py ADDED
@@ -0,0 +1,153 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import tkinter as tk
2
+ from tkinter import messagebox
3
+
4
+ class SudokuSolver:
5
+ def __init__(self, grid):
6
+ self.grid = grid
7
+
8
+ def is_valid(self, row, col, num):
9
+ for i in range(9):
10
+ if self.grid[row][i] == num:
11
+ return False
12
+ if self.grid[i][col] == num:
13
+ return False
14
+ start_row, start_col = 3 * (row // 3), 3 * (col // 3)
15
+ for r in range(start_row, start_row + 3):
16
+ for c in range(start_col, start_col + 3):
17
+ if self.grid[r][c] == num:
18
+ return False
19
+ return True
20
+
21
+ def solve_logic(self):
22
+ cycles = 0
23
+ while True:
24
+ changed = False
25
+ for digit in range(1, 10):
26
+ for box_row in range(3):
27
+ for box_col in range(3):
28
+ possible = []
29
+ for r in range(box_row * 3, (box_row + 1) * 3):
30
+ for c in range(box_col * 3, (box_col + 1) * 3):
31
+ if self.grid[r][c] == 0 and self.is_valid(r, c, digit):
32
+ possible.append((r, c))
33
+ if len(possible) == 1:
34
+ r, c = possible[0]
35
+ self.grid[r][c] = digit
36
+ changed = True
37
+ cycles += 1
38
+ if not changed:
39
+ break
40
+ print(f"\n=== Logic Solve Completed After {cycles} Cycle(s) ===")
41
+ for row in self.grid:
42
+ print(row)
43
+
44
+ def solve_backtracking(self):
45
+ empty = self.find_empty()
46
+ if not empty:
47
+ return True
48
+ r, c = empty
49
+ for num in range(1, 10):
50
+ if self.is_valid(r, c, num):
51
+ self.grid[r][c] = num
52
+ if self.solve_backtracking():
53
+ return True
54
+ self.grid[r][c] = 0
55
+ return False
56
+
57
+ def find_empty(self):
58
+ for r in range(9):
59
+ for c in range(9):
60
+ if self.grid[r][c] == 0:
61
+ return (r, c)
62
+ return None
63
+
64
+
65
+ class SudokuUI:
66
+ def __init__(self, root):
67
+ self.root = root
68
+ self.root.title("Sudoku Solver (Logic + Backtracking)")
69
+ self.entries = [[None for _ in range(9)] for _ in range(9)]
70
+ self.build_grid()
71
+ self.build_buttons()
72
+
73
+ def build_grid(self):
74
+ frame = tk.Frame(self.root)
75
+ frame.pack()
76
+ for r in range(9):
77
+ for c in range(9):
78
+ e = tk.Entry(frame, width=2, font=('Arial', 18), justify='center')
79
+ e.grid(row=r, column=c, padx=(2 if c % 3 == 0 else 0), pady=(2 if r % 3 == 0 else 0))
80
+ self.entries[r][c] = e
81
+
82
+ def build_buttons(self):
83
+ btn_frame = tk.Frame(self.root)
84
+ btn_frame.pack(pady=10)
85
+
86
+ logic_btn = tk.Button(btn_frame, text="Logic Solve", command=self.logic_solve)
87
+ logic_btn.pack(side='left', padx=5)
88
+
89
+ backtrack_btn = tk.Button(btn_frame, text="Start Backtracking", command=self.backtracking_solve)
90
+ backtrack_btn.pack(side='left', padx=5)
91
+
92
+ clear_btn = tk.Button(btn_frame, text="Clear", command=self.clear)
93
+ clear_btn.pack(side='left', padx=5)
94
+
95
+ def read_grid(self):
96
+ grid = []
97
+ print("\n=== Input Grid ===")
98
+ for r in range(9):
99
+ row = []
100
+ for c in range(9):
101
+ val = self.entries[r][c].get()
102
+ if val == '':
103
+ row.append(0)
104
+ else:
105
+ try:
106
+ num = int(val)
107
+ if not (1 <= num <= 9):
108
+ raise ValueError
109
+ row.append(num)
110
+ except ValueError:
111
+ messagebox.showerror("Invalid input", f"Invalid number at row {r+1}, col {c+1}")
112
+ return None
113
+ print(row)
114
+ grid.append(row)
115
+ return grid
116
+
117
+ def write_grid(self, grid):
118
+ for r in range(9):
119
+ for c in range(9):
120
+ self.entries[r][c].delete(0, tk.END)
121
+ if grid[r][c] != 0:
122
+ self.entries[r][c].insert(0, str(grid[r][c]))
123
+
124
+ def logic_solve(self):
125
+ grid = self.read_grid()
126
+ if grid is None:
127
+ return
128
+ solver = SudokuSolver(grid)
129
+ solver.solve_logic()
130
+ self.write_grid(solver.grid)
131
+
132
+ def backtracking_solve(self):
133
+ grid = self.read_grid()
134
+ if grid is None:
135
+ return
136
+ solver = SudokuSolver(grid)
137
+ print("\nStarting backtracking...")
138
+ solver.solve_backtracking()
139
+ print("\n=== Final Solved Grid ===")
140
+ for row in solver.grid:
141
+ print(row)
142
+ self.write_grid(solver.grid)
143
+
144
+ def clear(self):
145
+ for r in range(9):
146
+ for c in range(9):
147
+ self.entries[r][c].delete(0, tk.END)
148
+
149
+
150
+ if __name__ == "__main__":
151
+ root = tk.Tk()
152
+ app = SudokuUI(root)
153
+ root.mainloop()