n皇后问题

来源:互联网 发布:淘宝怎么货源怎么找 编辑:程序博客网 时间:2024/04/20 06:24

#include <stdio.h>
#include <malloc.h>

int queen(int n)
{
  int *q = (int *)malloc(sizeof(int) * (n + 1));
  int i, j, num = 0;
  for (q[0] = 0, i = 1; i < n + 1; ++i)
    q[i] = 1;
  i = 1;
  while ((q[1] <= n / 2) || ((n % 2) && (q[2] < n / 2)))
  {
    if (i > n)
    {
      printf("/n第%d种可行的情况是:/n", ++num);
      for (j = 1; j < i; ++j)
        printf("在第%d行,把棋放在第%d位。/n", j, q[j]);
      printf("/n第%d种可行的情况是:/n", ++num);
      for (j = 1; j < i; ++j)
        printf("在第%d行,把棋放在第%d位。/n", j, n - q[j] + 1);
      if (num % 10 == 0)
        getchar();
      ++(q[--i]);
    }
    else
    {
      for (j = 1; j < i; ++j)
        if ((q[i] == q[j]) || ((q[i] - q[j]) == (i - j)) || ((q[i] - q[j]) == (j - i)))
        {
          ++(q[i]);
          j = 0;
        }
      if (q[i] > n)
      {
        q[i] = 1;
        ++(q[--i]);
      }
      else
        ++i;
    }
  }
  free(q);
  return num;
}

int main (void)
{
  puts("请输入n的大小:");
  int n;
  scanf("%d", &n);
  getchar();
  printf("/n/n一共有%d种可能情况,已全部列出!/n", queen(n));
  getchar();
  return 0;
}