Я пытался решить проблему N-Queens (только 1 решение), и мне это удалось, но моя программа могла рассчитать только до N = 47 в течение достаточно длительного времени, поэтому я попытался реализовать наименьшее ограничивающее значение и наиболее ограничивающую переменнуюи хотя он стал быстрее, он все еще был медленным.Что я могу сделать, чтобы иметь возможность вычислить до N = 1000?
def solve(n, x, board, mid_rows, sd_squares):
# If we are on the last row, it means we have put all the queens:
if x >= n:
print_board(board)
sys.exit(0)
for i in sd_squares:
# If we can put a queen on the current square, do it
if isOk(board, mid_rows[x], i, n):
board[mid_rows[x]][i] = 1
# Do the same thing for the next row
solve(n, x + 1, board, mid_rows, sd_squares)
# If we are here, it means we put the queen in the wrong square so we have to remove that queen
board[mid_rows[x]][i] = 0
Я не могу опубликовать весь код, потому что он слишком длинный, но учтите, что isOk(board, x, y, n)
- это функция, которая сообщает, если мыставьте ферзь в строку x и столбец y, это угрожает другим королевам или нет.
mid_rows - это массив, который включает в себя наибольшее количество средних строк в боковых строках, так что, скажем, n = 5, тогда это [2,3,1,4,0]
или когда n = 6, это [3,2,4,1,5,0]
.
sd_squares - это список, который содержит боковые и средние квадраты.Например, когда n = 5, это [0,4,1,3,2]
или когда n = 6, это [0,5,1,4,2,3]
.