一聚教程网:一个值得你收藏的教程网站

热门教程

八皇后问题的递归求解

时间:2022-07-02 11:00:28 编辑:袖梨 来源:一聚教程网


八皇后问题的递归算法

#include
#include
#define N 8        /* 棋盘边长  */
#define XXN     15 /* 正(反)对角线个数 */
#define TRUE 1
#define FALSE 0
int map[N][N];/* 棋盘     */ 
int col[N];   /* 列       */
int XX[XXN];  /* 正对角线 */
int YY[XXN];  /* 反对角线 */
FILE* fp;
int num=0;  /* 解的个数 */

/**
显示一个解
*/
void showMap()
{

 int i,j;
 fprintf(fp,"n--------------------------n");
 for(i=0;i   for(j=0;j    fprintf(fp,"%-3d",map[i][j]);
   fprintf(fp,"n");
  }
}

/**
递归求解函数
*/
int  try(int y)
{
 int i,j;
 int success=FALSE;
 if( y==N){  /* 求出一个解*/
  showMap();
  num++;
  return TRUE;
 }
 for(i=0;i  if(XX[N-y+i]==0 && YY[i+y]==0 && col[i]==0) /* 保证布局要求; 对角线,列,没有重复放置棋子 */
  {

   XX[N-y+i]=YY[i+y]=col[i]=map[y][i]=1;
   if(try(y+1)) success=TRUE;              /* 放下一个皇后  */  
   XX[N-y+i]=YY[i+y]=col[i]=map[y][i]=0;
  }

 }
 return success;


}


main()
{
 int i,j,result;

 fp=fopen("queen8.txt","w+");
 for(i=0;i  for(j=0;j   map[i][j]=0;
 for(i=0;i

 fprintf(fp,"n start..............");
 if(!try(0))printf("n no resolution!");
 fprintf(fp,"n num=%d",num);

}


热门栏目