我写这个代码的原因是因为,八皇后问题是一个非常经典的递归问题,自己又掌握的不是很熟练,为了防止忘记,可以随时拿出来看一看,加深理解
#include<stdio.h>
int num; // 统计方案数目
int q[9]; // 记录每行皇后所在的列号
int c[9]; // 标记当前列是否安全,值取0(不安全)或1(安全)
int l[17]; // 标记左上到右下的对角线是否安全,值取0(不安全)或1(安全)
int r[17]; // 标记坐下到右上的对角线是否安全,值取0(不安全)或1(安全)
void queen(int i)
{
int j,k;
for(j = 1;j <= 8; ++j)
{
if(c[j] && l[i-j+9] && r[i+j]) // (i,j)所在的位置是安全的
{
q[i] = j; // 存储当前皇后的列位置
c[j] = 0;
l[i-j+9] = 0;
r[i+j] = 0; // 修改(i,j)位置的三个安全标记
if(i < 8)
queen(i+1); // 未放完8个皇后的,继续放下一个
else // 已放完皇后的,执行如下操作
{
num++; // 方案计数加1
printf("方案%2d: ",num); // 输出方案数
for(k = 1;k <= 8; k++)
printf("%d ",q[k]); // 输出
printf("\n");
}
c[j] = 1;
l[i-j+9] = 1;
r[i+j] = 1;
}
}
}
int main()
{
int i;
num = 0;
for(i = 0;i < 9; ++i)
c[i] = 1;
for(i = 0;i < 17; i++)
l[i] = r[i] = 1;
queen(1);
return 0;
}