如何为数独拼图添加另一个条件

时间:2018-01-19 21:14:11

标签: python python-3.x algorithm backtracking

我从秋天开始就用python开始编码。所以我不是一个专业的python编码器。 我已经开始编写一个Sudoku程序。幸运的是,最后我可以提出这个代码:

def isValid(num, x, y):
    for i in range(9):
        if board[i][y] == num:
            return False
        if board[x][i] == num:
            return False
    row = x - x % 3
    col = y - y % 3
    for i in range(3):
        for j in range(3):
            if board[i + row][j + col] == num:
                return False
    return True
def solve(remaining):
    if remaining == 0:
        return True
    for i in range(9):
        for j in range(9):
            if board[i][j] != 0:
                continue
            for num in range(1, 10):
                if isValid(num, i, j):
                    board[i][j] = num
                    if solve(remaining - 1):
                        return True
                    board[i][j] = 0
            return False
    return False
def pp():
    for i in range(9):
        for j in range(9):
            print(board[i][j], end=" ")
        print()
    print()
board = []
remaining = 0
for i in range(9):
    a=input()
    a=a.split()
    a = list(map(int, a))
    for j in a:
        if j == 0:
            remaining += 1
    board.append(a)
solve(remaining)
pp()

例如,我给它一个输入:

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

这是我的输出:

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

现在我打算为这个数独添加一个新的条件,这个可以在这个过程中为4个3 * 3的盒子做这个过程(这个名为Hyper-Sudoku):

对于我的谜题,它会返回:

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

有没有办法将此选项添加到我的数独,我必须更改我的整个算法?

感谢您的回答。

1 个答案:

答案 0 :(得分:3)

我认为你的程序看起来很棒。由于您将isValidsolve功能分开,因此可以更轻松地添加更改。您只需要修改isValid函数。

def isValid(num, x, y):
    # row and column check
    for i in range(9):
        if board[i][y] == num:
            return False
        if board[x][i] == num:
            return False

    # 3x3 tile check
    row = x - x % 3
    col = y - y % 3
    for i in range(3):
        for j in range(3):
            if board[i + row][j + col] == num:
                return False

    # Hypersudoku check
    if x not in [0, 4, 8] and y not in [0, 4, 8]:
        row = 1 if x < 4 else 5
        col = 1 if y < 4 else 5
        for i in range(3):
            for j in range(3):
                if board[i + row][j + col] == num:
                     return False

    return True