1. Одной явной проблемой является выделение памяти:
int **mat=(int **)malloc(sizeof(int *)*MAX);
for(i=0;i<=MAX;i++){
mat[i]=(int *)malloc(MAX*sizeof(int));
Учитывая, что MAX
равно 7, оба mallocs
выделяют слишком мало памяти для матрицы (семьэлементов вместо восьми).
Если честно, я бы переименовал MAX
в SIZE
или что-то подобное, и изменил бы все ваши циклы, чтобы использовать строго меньше чем, то есть
for(i = 0; i < SIZE; i++) {
Я бы сказал, что это немного более идиоматично и менее подвержено ошибкам.
2. Я не пытался отлаживать логику (я не думаю, что это справедливоожидайте, что мы сделаем это).Однако я заметил, что нигде, кроме main
, вы не присваиваете элементам mat
.Для меня это говорит о том, что код не может быть правильным.
3. Помимо этого, может быть полезно заметить, что в правильном решении каждая строка шахматной доски содержит ровно однуКоролева.Это означает, что вам на самом деле не нужна матрица 8x8 для представления решения: подойдет массив из 8 элементов столбцов.
edit В ответ на ваш вопрос в комментариях,Вот полная реализация Python, демонстрирующая пункт 3 выше:
def can_place(col_positions, col):
row = len(col_positions)
for r, c in enumerate(col_positions):
if c == col or abs(c - col) == abs(r - row): return False
return True
def queens(n, col_positions = []):
if len(col_positions) >= n:
pretty_print(n, col_positions)
return True
for col in xrange(n):
if can_place(col_positions, col):
if queens(n, col_positions + [col]):
return True
return False
def pretty_print(n, col_positions):
for col in col_positions:
print '.' * col + 'X' + '.' * (n - 1 - col)
queens(8)