⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 queen.c

📁 上的风格上的风格上的风格上的风格上的风格上的风格上的风格风格上对方风大哥上的风格
💻 C
字号:
/*八皇后问题的递归算法*/
#include <stdio.h>
#include <stdlib.h>
#define N 8   // 棋盘边长  
#define n 15 //正(反)对角线个数 
int MAP[N][N];// 棋盘      
int COL[N];   //列       
int zDiag[n];  // 正对角线.对角线编号从左下角开始依次是0、1....14 
int fDiag[n];  // 反对角线 .对角线编号从左上角开始依次是0、1....14 
int num=0;  //解的个数 
void  try1(int,FILE *);
void showMap(FILE *);//函数申明 
main()
{
    int i,j,result;
    FILE *f;

	for(i=0;i<N;i++)//棋盘初始化 
  		for(j=0;j<N;j++)
     		MAP[i][j]=0;
   
    for(i=0;i<n;i++) 
 	    zDiag[i]=fDiag[i]=0;
    if((f=fopen("queen.txt","w"))==NULL)
        printf("File could not be opened!\n");
    else
        try1(0,f);
    printf("\n 一共有%d种情况 ",num);
    
    fclose(f);
    system("pause");
    return 0;
}

void showMap(FILE *f)//函数showMap定义 用来显示一个解
{
	int i,j;
	char ch;

	fprintf(f,"\n------ 第%d种解为 :-------\n",num);
 	for(i=0;i<N;i++)
  	{
   		for(j=0;j<N;j++)
       		fprintf(f,"%-3d",MAP[i][j]);
   		fprintf(f,"\n");
    }
    /*printf("\nInput to continue:");
    fflush(stdin);
    scanf("%c",&ch); */
}


void  try1(int y,FILE *f)//函数try1定义 表示要在y行以及后续行放置棋子 递归求解函数
{
	int i,j;

	if( y==N) // 打印一个解,并退出递归
 	{ 
    	num++;
        showMap(f);//打印每一种情况 
	}
 	else
 		for(i=0;i<N;i++) //N表示当前试探的列
  			if(zDiag[N-1-y+i]==0 && fDiag[i+y]==0 && COL[i]==0) // 保证布局要求; 对角线,列,没有重复放置棋子 
  			{ 
     			zDiag[N-1-y+i]=fDiag[i+y]=COL[i]=MAP[y][i]=1; //列、对角线、反对角线做上不能放的标志
     			try1(y+1,f);              // 放下一个皇后    
     			zDiag[N-1-y+i]=fDiag[i+y]=COL[i]=MAP[y][i]=0; //回溯回来后,撤去不能放的标志,列、对角线、反对角线撤去不能放的标志
  			}
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -