Python数独解算器在中午停止

2024-09-28 04:19:17 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我决定写一个数独解算器使用回溯方法来解决一个数独。在我看来,我让它工作了,但它没有。在我看来,当它必须移回前一行它不能处理它,它只能移回在同一行它似乎在我看来。请随时提出更多问题,代码如下(抱歉,不是英文):

import sys

rida = 0
veerg = 0
maatriks = []

# Loeb failist maatriksi sisse ja teeb temast listide listi.
def looMaatriks(sisendfail, maatriks):
    fail = open(sisendfail)
    for line in fail:
        line = line.strip()
        if line != "":
            rida = line.split(" ")
            for i in range (0, 9):
                if rida[i] != "-":
                    rida[i] = int(rida[i])
                else:
                    rida[i] = 0
            print(line.split(" "))
            maatriks.append(rida)
    return maatriks

maatriks = looMaatriks('sisend1.txt', maatriks)
#print(maatriks)

# Kontrollib, kas antud ruudukeses on number juba või mitte.
def numberOlemas(maatriks, rida, veerg):
    print(rida)
    print(veerg)
    if maatriks[rida][veerg] != 0:
        return True
    else:
        return False

print(numberOlemas(maatriks, 1,0))

# Kontrollib, kas arv sobib antud ruutu.
def kasSobib(maatriks, rida, veerg, arv):
    for i in range (0, 9):
        if arv == maatriks[rida][i]:
            return False
    for i in range (0, 9):
        if arv == maatriks[i][veerg]:
            return False
    return True

def prindiMaatriks(maatriks):
    for i in range (0, 9):
        print(maatriks[i])
    print("")

def lahendaRuut(maatriks, rida, veerg):
    prindiMaatriks(maatriks)

    if numberOlemas(maatriks, rida, veerg) == True:
        print("juba olemas")
        if veerg > 7:
            print("yolo2");
            rida = rida + 1
            if rida > 8:
                print("DONE!")
                sys.exit()
            veerg = -1        
        lahendaRuut(maatriks, rida, veerg + 1)
    else:
        for i in range (1, 10):
            if kasSobib(maatriks, rida, veerg, i):
                maatriks[rida][veerg] = i
                if veerg > 7:
                    print("yolo");
                    rida = rida + 1
                    if rida > 8:
                        print("DONE!")
                        sys.exit()
                    veerg = -1
                lahendaRuut(maatriks, rida, veerg + 1)
            print("ei sobi")

    prindiMaatriks(maatriks)
lahendaRuut(maatriks, rida, veerg)

Tags: inforreturnifdefsyslinerange
1条回答
网友
1楼 · 发布于 2024-09-28 04:19:17

问题是你永远不会删除错误的号码。数独逐渐被错误的数字填满了。你知道吗

def lahendaRuut(maatriks, rida, veerg):
    prindiMaatriks(maatriks)

    if numberOlemas(maatriks, rida, veerg) == True:
        print("juba olemas")
        if veerg > 7:
            print("yolo2");
            rida = rida + 1
            if rida > 8:
                print("DONE!")
                sys.exit()
            veerg = -1        
        lahendaRuut(maatriks, rida, veerg + 1)
    else:
        for i in range (1, 10):
            if kasSobib(maatriks, rida, veerg, i):
                maatriks[rida][veerg] = i
                if veerg > 7:
                    print("yolo");
                    rida = rida + 1
                    if rida > 8:
                        print("DONE!")
                        sys.exit()
                    veerg = -1
                lahendaRuut(maatriks, rida, veerg + 1)
            print("ei sobi")

         #=========================
         # very important line of code
         # resets the cell before the algorithm backtracks
         maatriks[rida][veerg] = 0 
         #=========================


    prindiMaatriks(maatriks)

相关问题 更多 >

    热门问题