Khi gán một giá trị cho một ô (spot), cần đảm bảo giá trị đó khi đó không xung đột với hàng, cột, hoặc hình vuông chứa ô đó. Ta cần kiểm tra ngay tính hợp lệ của các giá trị gán cho một ô, thay vì gán đại các giá trị bất kì từ 1 đến 9 rồi ở các bước đệ quy sau mới phát hiện ra sự bất hợp lệ. Giả sử rằng toàn bộ bảng vuông ban đầu hợp lệ, từ đó ta cũng chỉ gán các giá trị hợp lệ cho các ô.
Có 81 ô trong bảng Sudoku. Bạn có thể gán trị cho các ô theo thứ tự tùy ý. Tuy nhiên, trong lời giải của chúng ta, đầu tiên hãy sắp thứ tự các ô theo chiều tăng dần của kích thước của tập các giá trị có thể gán cho nó. Tìm kiếm đệ quy theo thứ tự đó, gán cho các ô có ít lựa chọn nhất trước. Trong quá trình tìm kiếm, đừng sắp xếp lại thứ tự các ô. Sắp xếp một lần và giữ nguyên thứ tự là đủ tốt. Việc sắp thứ tự chỉ là gần tối ưu, nhưng nó dễ làm và hiệu quả.
Ta đặt một ngưỡng tối đa là 100. Nếu quá trình tìm kiếm đã phát hiện được 100 đáp số hoặc nhiều hơn, nó có thể dừng lại và trả về số lượng đáp số đã tìm được.
Đối với bài tập này, code khởi đầu đã có một số hàm và dữ liệu, phần còn lại của thiết kế là tùy ở bạn. Mục tiêu của bạn là thiết kế các lớp và API sao cho phương thức solve() (xem dưới đây) là một thể hiện trong sáng của chiến lược mô tả ở trên, và hàm main() và chương trình GUI cũng được viết một cách trong sáng. Ta sẽ sử dụng cách tiếp cận hướng đối tượng đối với thuật toán tìm kiếm: coi mỗi ô (spot) là một đối tượng. Tạo một lớp Sudoku đóng gói một bài Sudoku và cho nó một lớp Spot là inner class đại diện cho một ô trong bài.
Tăng hiệu quả chương trình theo tỷ lệ hằng số (làm cho chương trình chạy nhanh gấp C lần) không phải là mối quan tâm lớn ở đây. Ta cần chú ý đến tính đúng đắn, tính trong sáng của code, và một chiến lược thông minh.
Hãy tập trung vào thiết kế hướng đối tượng cho lớp Spot -- đẩy sự phức tạp vào bên trong Spot, để client của Spot được đơn giản. Chẳng hạn, Spot có cổng truy nhập riêng tới lưới vuông (nhớ rằng nó là inner class của Sudoku). Xét hai ví dụ sau của client code:
// Bad grid[spot.getRow()][spot.getCol()] = 6; // Good spot.set(6);
Bạn có thể thiết kế code tùy ý, miễn thỏa mãn các yêu cầu sau...
Bạn có thể dùng Integer hoặc int hoặc gì đó tùy ý để theo dõi trạng thái của lưới. Có thể tận dụng Set<Integer>/HashSet<Integer> và các hàm có sẵn như contains(), addAll(), removeAll() để phục vụ mục đích này.