изменение n ферзей проблемы с возвратом - PullRequest
0 голосов
/ 10 марта 2020

У меня есть программа N queen с возвратом (она генерирует все возможные решения), которую я хочу изменить таким образом, чтобы она помещала ферзей в половину каждого столбца и половину каждой строки (количество столбцов и строк) четные). например, если у меня есть 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 голосов
/ 24 марта 2020

Если вы нажмете последний элемент на доске, у вас будет col = w и row = t-1. Таким образом, в solveNQUtil вы войдете в первый блок и установите col = 0 и row = t. Затем при следующей проверке у вас будет не col == w, а col = 0. Таким образом, вы продолжаете, а затем пытаетесь получить доступ к board[row], что, конечно, выходит за пределы.

Я полагаю, что проверка того, достигли ли вы конца, должна быть first thin in solveNQutil и должен читать что-то вроде if col == w and row == t - 1?

...