Рекурсивная проблема N-рыцарей

0

Я пытаюсь решить проблему n- рыцарей на шахматной доске 8x8 рекурсивно. Проблема с рыцарями n- - это вариация проблемы ферзей n-, где королевы заменяются рыцарями. Никакая часть не может взять другую вещь.

Мой код пока: http://pastebin.com/TVza3jVU.

Вход состоит из числа рыцарей, которые должны быть размещены на шахматной доске. Мой код печатает много правильных досок

Результат выглядит следующим образом (пример):

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

0 1 2 3 4 5 6 7

nrBoards = 49

"1" обозначает рыцаря.


Моя проблема заключается в следующем:

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

0 1 2 3 4 5 6 7

Это последняя доска, на которой будет напечатан мой сценарий. Он никогда не поставит рыцаря на [0] [0]. Я не могу понять, почему. Он также пропускает некоторые конфигурации. Что-то не так с моей рекурсией?

  • 3
    Можете ли вы опубликовать код здесь, а не ссылки в другом месте?
  • 0
    Введение в информатику?
Показать ещё 1 комментарий
Теги:
recursion
n-queens

1 ответ

0

Из кода, который вы связали, кажется, что одна проблема заключается в вашей функции checkplace(). Вы не проверяете, находятся ли границы x + 2, x-2, y + 2, y-2 и т.д. В интервале от 0 до 7 или из него.

int checkPlace(int y, int x, chessboard boards) {
    if (boards.board[y - 2][x - 1] == 1) {
      return 0;
    }
    if (boards.board[y - 1][x - 2] == 1) {
      return 0;
    }
    if (boards.board[y - 2][x + 1] == 1) {
      return 0;
    }
    if (boards.board[y - 1][x + 2] == 1) {      
      return 0;
    }
    if (boards.board[y + 1][x + 2] == 1) {
      return 0;
    }
    if (boards.board[y + 1][x - 2] == 1) {      
      return 0;
    }
    if (boards.board[y + 2][x - 1] == 1) {
      return 0;
    }
    if (boards.board[y + 2][x + 1] == 1) {
      return 0;
    }
    return 1;
}

Вместо:

if ( x-1 >= 0 && y-2 >= 0 && boards.board[y - 2][x - 1] == 1) {

Аналогично для других.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню