Я пытаюсь решить проблему 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]. Я не могу понять, почему. Он также пропускает некоторые конфигурации. Что-то не так с моей рекурсией?
Из кода, который вы связали, кажется, что одна проблема заключается в вашей функции 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) {
Аналогично для других.