簡體   English   中英

無法使用 python 創建數獨級別

[英]Cant create a Sudoku level with python

我正在用 python 制作一個在終端中運行的數獨,但我無法分配數字來用數字填滿棋盤。 這是我的所有功能和主程序的代碼。 我認為錯誤在於數字的檢查器中。

def createBoard ():
    rows = 9
    columns = 9
    matrix = []
    for r in range(rows):
        matrix.append([])  # agregar lista
        for c in range(columns):
            matrix[r].append("")

    return matrix


def printBoard (board):
    for i in range (len(board)):
        print (board[i])

def defineSubMatrix (row, column):

    subMatrix = -1

    if row >= 0 and row <= 2:
        if column >= 0 and column <= 2:
            subMatrix = 0
        if column >= 3 and column <= 5:
            subMatrix = 1
        if column >= 6 and column <= 8:
            subMatrix = 2

    if row >= 3 and row <= 5:
        if column >= 0 and column <= 2:
            subMatrix = 3
        if column >= 3 and column <= 5:
            subMatrix = 4
        if column >= 6 and column <= 8:
            subMatrix = 5

    if row >= 3 and row <= 5:
        if column >= 0 and column <= 2:
            subMatrix = 6
        if column >= 3 and column <= 5:
            subMatrix = 7
        if column >= 6 and column <= 8:
            subMatrix = 8

    return  subMatrix

def createLevel (board):
    for i in range (0, 8):
        for j in range (0, 8):
            num = random.randint (1, 9)
            
            check = checker(board, num, i, j)

            while check == False:
                if check == False:

                    num = random.randint (1, 9)
                    check = checker(board, num, i, j)

                board[i][j] = num

            board[i][j] = num

    return board


def checker (board, num, posX, posY):
    ### ok = True cuando check == 0
    ok = False
    checkT = 0
    checkR = 0
    checkC = 0
    checkSM = 0

    ###Check row right
    i = posX
    while i + 1 <= 8:
        if board[i][posY] == num:
            checkR += 1
        i = i + 1

    ###Check row left
    i = posX
    while i - 1 >= 0:
        if board[i][posY] == num:
            checkR += 1
        i = i - 1

    ###Check column down
    j = posY
    while j + 1 <= 8:
        if board[posX][j] == num:
            checkC += 1
        j = j + 1

    ###Check column up
    j = posY
    while j - 1 >= 0:
        if board[posX][j] == num:
            checkC += 1
        j = j - 1


    ###Check Submatrix
    subMatrix = defineSubMatrix(posX, posY)
    if subMatrix == 0:
        for i in range (0, 2):
            for j in range (0, 2):
                if board[i][j] == num:
                    checkSM += 1

    if subMatrix == 1:
        for i in range (3, 5):
            for j in range (0, 2):
                if board[i][j] == num:
                    checkSM += 1

    if subMatrix == 2:
        for i in range (6, 8):
            for j in range (0, 2):
                if board[i][j] == num:
                    checkSM += 1

    if subMatrix == 3:
        for i in range (0, 2):
            for j in range (3, 5):
                if board[i][j] == num:
                    checkSM += 1

    if subMatrix == 4:
        for i in range (3, 5):
            for j in range (3, 5):
                if board[i][j] == num:
                    checkSM += 1

    if subMatrix == 5:
        for i in range (6, 8):
            for j in range (3, 5):
                if board[i][j] == num:
                    checkSM += 1

    if subMatrix == 6:
        for i in range (0, 2):
            for j in range (6, 8):
                if board[i][j] == num:
                    checkSM += 1

    if subMatrix == 7:
        for i in range (3, 5):
            for j in range (6, 8):
                if board[i][j] == num:
                    checkSM += 1

    if subMatrix == 8:
        for i in range (6, 8):
            for j in range (6, 8):
                if board[i][j] == num:
                    checkSM += 1

    checkT = checkR + checkSM + checkC

    if checkT == 0:
        ok = True

    return ok

def main ():
    board = createBoard()

    subma = defineSubMatrix(0, 6)
    print (subma)

    printBoard(board)
    print ("Board Created")

    level = createLevel(board)
    print ("Level created")

    printBoard(level)

    
###PROGRAMA
main()

您無法通過這種方式創建數獨,僅通過隨機選擇即可。 你很快就會陷入這樣的境地:

1 2 3 4 5 6 7 8 9
4 5 6 1 2 3 . . .

現在沒有下一個單元格的可能性。

許多數獨算法創建網格的方式與人類解決它們的方式相同,使用復雜的啟發式方法。 可以使用蠻力。 考慮到每個數獨謎題都可以通過使用 (a) 交換行,(b) 交換列,(c) 交換 3 行集,(d) 交換 3 列集,( e) 旋轉 90 度,以及 (f) 跨軸鏡像。 鑒於此,您可以從這樣一個有序矩陣開始:

1 2 3 4 5 6 7 8 9
4 5 6 7 8 9 1 2 3
7 8 9 1 2 3 4 5 6
2 3 4 5 6 7 8 9 1
5 6 7 8 9 2 3 4 5
8 9 1 2 3 4 5 6 7
3 4 5 6 7 8 9 1 2
6 7 8 9 1 2 3 4 5
9 1 2 3 4 5 6 7 8

然后進行隨機交換、旋轉和鏡像,就像洗一副紙牌一樣。 看這篇文章:

https://www.algosome.com/articles/create-a-solved-sudoku.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM