メソッドの変数外を変更することができません。

MD:

私は数独ゲームのボットを作成しようとしています。それは仕事に思えますが、解決グリッドが唯一の方法の内側に印刷された小さな問題があります。私はそれを実行すると、印刷(game.board)は、未解決の1つを出力します。

これは私のコードです:

import numpy as np


class Game:

    def solve(self):
        def possible(y,x,n):
            for i in range(9):
                if self.board[y][i] == n:
                    return(False)

            for i in range(9):
                if self.board[i][x] == n:
                    return(False)

            gridx = (x // 3) * 3
            gridy = (y // 3) * 3

            for i in range(3):
                for j in range(3):
                    if self.board[gridy + i][gridx + j] == n:
                        return(False)

            return(True)

        def solving():
            for y in range(9):
                for x in range(9):
                    if self.board[y][x] == 0:
                        for n in range(1,10):
                            if possible(y,x,n):

                                self.board[y][x] = n
                                solving()
                                self.board[y][x] = 0
                        return
            print(np.matrix(self.board))
        solving()  


game = Game()
game.board = [
    [7,8,0,4,0,0,1,2,0],
    [6,0,0,0,7,5,0,0,9],
    [0,0,0,6,0,1,0,7,8],
    [0,0,7,0,4,0,2,6,0],
    [0,0,1,0,5,0,9,3,0],
    [9,0,4,0,6,0,0,0,5],
    [0,7,0,3,0,0,0,1,2],
    [1,2,0,0,0,7,4,0,0],
    [0,4,9,2,0,6,0,0,7]
]
game.solve()
print(game.board)
gelonida:

あなたのコードは、しかし、それは後で試してみた番号の設定を解除)(再帰的解決を呼びかけています。

あなたがしなければならなかったことは、すぐにあなたが解決策を見つけるようアボートです。

ただ、解決策が発見された場合、それが停止していること、など、解決に変更します。

        def solving():
            for y in range(9):
                for x in range(9):
                    if self.board[y][x] == 0:
                        for n in range(1,10):
                            if possible(y,x,n):

                                self.board[y][x] = n
                                solved = solving()
                                if solved:
                                    return True
                                self.board[y][x] = 0
                        return False
            return True

        solving()

ボーナス:

ここにあなたのソルバーの(関数のネストなし)バージョンを平坦化:私はまた、追加__init__ボードがクラスに渡されるように、機能を。

import numpy as np


class Game:
    def __init__(self, board):
        self.board = board

    def possible(self, y, x, n):

        for i in range(9):
            if self.board[y][i] == n:
                return False

        for i in range(9):
            if self.board[i][x] == n:
                return False

        gridx = (x // 3) * 3
        gridy = (y // 3) * 3

        for i in range(3):
            for j in range(3):
                if self.board[gridy + i][gridx + j] == n:
                    return False

        return True

    def solving(self):
        for y in range(9):
            for x in range(9):
                if self.board[y][x] == 0:
                    for n in range(1,10):
                        if self.possible(y,x,n):

                            self.board[y][x] = n
                            solved = self.solving()
                            if solved:
                                return True
                            self.board[y][x] = 0
                    return False
        return True

    def solve(self):
        self.solving()
        return self.board


board = [
    [7,8,0,4,0,0,1,2,0],
    [6,0,0,0,7,5,0,0,9],
    [0,0,0,6,0,1,0,7,8],
    [0,0,7,0,4,0,2,6,0],
    [0,0,1,0,5,0,9,3,0],
    [9,0,4,0,6,0,0,0,5],
    [0,7,0,3,0,0,0,1,2],
    [1,2,0,0,0,7,4,0,0],
    [0,4,9,2,0,6,0,0,7]
]

game = Game(board)

print(np.matrix(game.board))
game.solve()
print(np.matrix(game.board))

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=298682&siteId=1