Все возможные решения алгоритма n-Queen

При реализации алгоритма для всех возможных решений проблемы 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 () , но не вернул управление родительскому элементу, вместо этого продолжил перечисление и проверку. Вызов этой функции отображает повторяющиеся результаты, достигнутые разными ветвями.

6
задан phoxis 11 October 2011 в 17:59
поделиться