- Tham gia
- 8/6/06
- Bài viết
- 14,808
- Được thích
- 23,286
- Nghề nghiệp
- U80
Đây rồi, bản mô tả luật SudokuX ngắn gọn – súc tích – dễ đăng ngay lên diễn đàn Excel:
SudokuX – Luật chơi
Với cách viết này, bạn vừa có phần luật rõ ràng, vừa có phần giới thiệu hấp dẫn để thu hút người chơi.
Mình sẽ cho bạn một đoạn VBA solver đơn giản để kiểm tra xem bàn Sudoku (bao gồm cả SudokuX) có nghiệm hay không. Đây là dạng backtracking cơ bản – duyệt từng ô trống, thử điền số từ 1 đến 9, và kiểm tra hợp lệ. Nếu hợp lệ thì tiếp tục, nếu không thì quay lui.
Lưu ý:
SudokuX – Luật chơi
- SudokuX giữ nguyên luật Sudoku truyền thống: mỗi hàng, mỗi cột, và mỗi ô 3×3 phải chứa đủ các số từ 1 đến 9, không trùng lặp.
- Điểm khác biệt duy nhất: hai đường chéo (chính và phụ) được cố định bằng hai chuỗi ngẫu nhiên không trùng nhau.
- Người chơi phải hoàn thiện phần còn lại của bàn Sudoku trong điều kiện ràng buộc này.
Lời mời thách thức
SudokuX – biến thể mới dành cho những bộ óc mê logic!Hai đường chéo đã được khóa bằng chuỗi ngẫu nhiên.Bạn có dám chinh phục thử thách này không?Với cách viết này, bạn vừa có phần luật rõ ràng, vừa có phần giới thiệu hấp dẫn để thu hút người chơi.
Bài đã được tự động gộp:
Mình sẽ cho bạn một đoạn VBA solver đơn giản để kiểm tra xem bàn Sudoku (bao gồm cả SudokuX) có nghiệm hay không. Đây là dạng backtracking cơ bản – duyệt từng ô trống, thử điền số từ 1 đến 9, và kiểm tra hợp lệ. Nếu hợp lệ thì tiếp tục, nếu không thì quay lui.
VBA Solver cơ bản cho Sudoku
PHP:
Option Explicit
Const N = 9
Dim board(1 To N, 1 To N) As Integer
' Kiểm tra số có hợp lệ tại vị trí (row, col) '
Function IsValid(row As Integer, col As Integer, num As Integer) As Boolean
Dim i As Integer, j As Integer
' Kiểm tra hàng '
For i = 1 To N
If board(row, i) = num Then IsValid = False: Exit Function
Next i
' Kiểm tra cột '
For i = 1 To N
If board(i, col) = num Then IsValid = False: Exit Function
Next i
' Kiểm tra ô 3x3 '
Dim startRow As Integer, startCol As Integer
startRow = ((row - 1) \ 3) * 3 + 1
startCol = ((col - 1) \ 3) * 3 + 1
For i = 0 To 2
For j = 0 To 2
If board(startRow + i, startCol + j) = num Then IsValid = False: Exit Function
Next j
Next i
IsValid = True
End Function
' Hàm giải Sudoku bằng backtracking '
Function SolveSudoku() As Boolean
Dim row As Integer, col As Integer, num As Integer
For row = 1 To N
For col = 1 To N
If board(row, col) = 0 Then ' ô trống '
For num = 1 To N
If IsValid(row, col, num) Then
board(row, col) = num
If SolveSudoku() Then
SolveSudoku = True
Exit Function
End If
board(row, col) = 0 ' quay lui '
End If
Next num
SolveSudoku = False
Exit Function
End If
Next col
Next row
SolveSudoku = True ' tất cả ô đã điền '
End Function
Cách dùng
- Bạn nhập bàn Sudoku vào mảng board(1 To 9, 1 To 9).
- Dùng số 0 cho ô trống.
- Điền sẵn hai đường chéo ngẫu nhiên theo quy tắc SudokuX.
- Gọi SolveSudoku().
- Nếu trả về True → bàn có nghiệm.
- Nếu trả về False → bàn vô nghiệm.
- Sau khi chạy, mảng board sẽ chứa lời giải.
- Đoạn solver này chỉ kiểm tra có nghiệm hay không, chưa kiểm tra nghiệm duy nhất.
- Muốn kiểm tra nghiệm duy nhất, bạn cần sửa solver để đếm số nghiệm (ví dụ: tăng biến đếm mỗi khi tìm thấy lời giải, nếu >1 thì bàn có nhiều nghiệm).
Lần chỉnh sửa cuối:
