当前位置:编程学习 > C#/ASP.NET >>

八皇后问题的递归求解


八皇后问题的递归算法

#include <stdio.h>
#include <stdlib.h>
#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<N;i++){
   for(j=0;j<N;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<N;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<N;i++)
  for(j=0;j<N;j++)
   map[i][j]=0;
 for(i=0;i<XXN;i++) XX[i]=YY[i]=0;

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

}


补充:asp.net教程,C语言
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,