通过回溯改变n个皇后区问题

时间:2020-03-10 14:49:35

标签: python backtracking n-queens

我有一个带有回溯功能的N皇后程序(它生成所有可能的解决方案),我想对其进行更改,以便将皇后区放在每一列的一半和每一行的一半(列数和行数)中甚至)。例如,如果我有6列4行,则每行放置2个皇后,每列3个皇后。

输出示例:

[[1 0 1 0 0 1]
 [0 1 0 1 1 0]
 [1 0 1 0 0 1]
 [0 1 0 1 1 0]]

问题是当我运行脚本时出现此错误:

IndexError: index 4 is out of bounds for axis 0 with size 4

我不知道我做错了什么。 这是我的代码:

k = 1
global N
t=4
N=t-1
w=(t-1)*2
def printSolution(board): 

    global k 
    print(k, "-\n") 
    k = k + 1
    for i in range(N*2): 
        for j in range(N*2): 
            print(board[i][j], end = " ") 
        print("\n") 
    print("\n") 

def isSafe(board, row, col) : 

    for i in range (row):
            for j in range(col): 
                if np.sum(board[i][j])>N: 
                    return False

    for j in range (col):
            for i in range(row): 
                if np.sum(board[i][j])> int(t/2): 
                    return False

    return True

def solveNQUtil(board,row, col) : 


    if col>=w and row<t:
            col=0
            row+=1
    if (col == w and row==t): 
            printSolution(board) 
            return True

    res = False
    for i in range(N): 
        if (isSafe(board, row, col)): 

            board[row][col] = 1; 


            res = solveNQUtil(board, row,col+1 ) or res; 

    return res 


def solveNQ() : 

    board = np.zeros((t,w)) 

    if (solveNQUtil(board, 0,0) == False): 

        print("Solution does not exist") 
        return
    return
solveNQ() 

1 个答案:

答案 0 :(得分:0)

如果您击中棋盘上的最后一个元素,您将拥有col = wrow = t-1。因此,在solveNQUtil中,您将输入第一个块并设置col = 0row = t。然后,在下一个检查中,您没有col == w,而是col = 0。因此,您继续操作,以后尝试访问board[row],这当然是超出范围的。

我猜您是否到达终点的测试应该是solveNQutil中的第一瘦,并且应该读到类似if col == w and row == t - 1的东西?