SodokuX nhờ Copilot trợ giúp (4 người xem)

Người dùng đang xem chủ đề này

SA_DQ

/(hông là gì!
Thành viên danh dự
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
  • 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.
Tóm gọn: SudokuX = Sudoku truyền thống + hai đường chéo ngẫu nhiên.

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​

  1. 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.
  2. Gọi SolveSudoku().
    • Nếu trả về True → bàn có nghiệm.
    • Nếu trả về False → bàn vô nghiệm.
  3. Sau khi chạy, mảng board sẽ chứa lời giải.
⚡ Lưu ý:
  • Đ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).
Bạn có muốn mình mở rộng đoạn solver này thành phiên bản đếm số nghiệm để bạn biết bàn SudokuX có duy nhất một lời giải hay nhiều lời giải không?
 
Lần chỉnh sửa cuối:

Bài viết mới nhất

Back
Top Bottom