При реализации алгоритма для всех возможных решений проблемы n-Queen я обнаружил, что одно и то же решение достигается многими ветвями. Есть ли какой-нибудь хороший способ создать все уникальные решения проблемы n-Queens? Как избежать дублирования решений, генерируемых разными ветвями (кроме хранения и сравнения)?
Вот что я пробовал для первого решения: http://www.ideone.com / hDpr3
Код:
#include
#include
#include
/* crude */
#define QUEEN 'Q'
#define BLANK '.'
int is_valid (char **board, int n, int a, int b)
{
int i, j;
for (i=0; i=0) && (j>=0); i--, j--)
{
if (board[i][j] == QUEEN)
return 0;
}
for (i=a, j=b; (i=0) && (j=0); i++, j--)
{
if (board[i][j] == QUEEN)
return 0;
}
return 1;
}
void show_board (char **board, int n)
{
int i, j;
for (i=0; i
Чтобы сгенерировать все возможные решения, я использовал ту же функцию кода nqdfs_all ()
, но не вернул управление родительскому элементу, вместо этого продолжил перечисление и проверку. Вызов этой функции отображает повторяющиеся результаты, достигнутые разными ветвями.