首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用python创建数独级别

无法使用python创建数独级别
EN

Stack Overflow用户
提问于 2021-07-22 05:28:36
回答 1查看 53关注 0票数 0

我正在做一个用python在终端上运行的数独游戏,我不能分配数字来填满棋盘。这是我的所有函数和主程序的代码。我想错误出在数字的检验器里。

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

发布于 2021-07-22 06:01:05

你不能仅仅通过随机选择来创建数独游戏。你很快就会遇到这样的情况:

代码语言:javascript
复制
1 2 3 4 5 6 7 8 9
4 5 6 1 2 3 . . .

现在没有下一个细胞的可能性了。

许多数独算法使用复杂的启发式方法创建网格,与人类求解网格的方式相同。使用暴力是可能的。考虑到每个数独难题都可以通过使用(a)交换行、(b)交换列、(c)交换3行的集合、(d)交换3列的集合、(e)旋转90度和(f)跨一个轴的镜像的组合来从每个其他的数独难题导出。鉴于此,您可以从一个排序良好的矩阵开始,如下所示:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68476655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档