现在的位置: 首页 > 综合 > 正文

8皇后问题

2019年04月25日 ⁄ 综合 ⁄ 共 1266字 ⁄ 字号 评论关闭

//皇后数 4  5   6  7   8    9   10   11    12      13      14
//独立解 1  2   1  6   12  46   92   341   1787   9233   45752
//全部解 2  10  4  40  92  352  724  2680  14200  73712  365596

#include <stdio.h>

#define N 8 //皇后个数

int a[N] = {0}; //a[i]代表i+1行第a[i]列

void print()
{//将每次的编排输出显示
 static int icount = 0;  //统计有多少种
 int i = 0;  //行
 int j = 0;  //列

 icount++;
 printf("%d******************************%d\n",icount,icount);

 for(i=0; i<N; ++i)
 {
  for(j=0; j<N; ++j)
  {
   if(a[i] == j+1)
    printf(" %c",'x'); //是皇后打印x
   else
    printf(" %c",'o'); //不是皇后打印o
  }
  printf("\n");
 }
}

int check(const int i,const int j)
{//检查(i,j)位置是否可以放置
 int m = 0;
 int n = 0;
 int flag = 0; //可放标志
 //可放返回0,不可放返回1

 //位置超出
 if(i >= N || j>= N)
  flag = 1;

 for(m=0; 0==flag && m<i; ++m)
 {//列
  if(a[m] == j+1)
  {
   flag = 1;break;
  }
 }
 for(m=i-1,n=j-1; 0==flag && m>=0 && n>=0; --m,--n)
 {//左上
  if(a[m] == n+1)
  {
   flag = 1;break;
  }
 }

 for(m=i-1,n=j+1; 0==flag && m>=0 && n<N; --m,++n)
 {//右上
  if(a[m] == n+1)
  {
   flag = 1;break;
  }
 }

 if(0 == flag)
 {//若该位置可以放则存入
  a[i] = j+1;
 }

 return flag;
}

int main()
{
 int i = 0;
 int j = 0;
 int h_count = 0;
 while(-1 != i)
 {
  if(0 == check(i,j))
  {//等于0说明放置成功
   i++; //下一行
   j = 0; //从第一列开始
   h_count++; //已放置的皇后+1
   if(N == h_count)
   {//若放满N个皇后则输出显示
    print();
   }
  }
  else
  {//该位置不能放置
   j++; //列后移一位
   if(N <= j)
   {//若列已超出最后位置
    i--; //退到上层皇后
    h_count--; //已放置皇后-1
    j = a[i]; //皇后后移一列
   }
  }
 }
 return 0;
}

【上篇】
【下篇】

抱歉!评论已关闭.