📄 queen.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 + -