SodokuX nhờ Copilot trợ giúp (2 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