程序代码出自于:http://hi.baidu.com/lauo1988/blog/item/14647d09c01d9787d0581b61.html#comment
由于程序没有注释,我用自己的理解重新注释了下。
代码很简洁如下:
#include"stdio.h"
int i,j,r=0,k,b[8]; // b数组储存8皇后所处列位置 r为解的个数
bool check(int i,int j)
{
if(i==0) // 头次调用函数返回
return true;
else
{
for(k=i-1;k>=0;k--) // 由于函数的递归是从棋盘的第一行到尾行 所以只判断第i行之上的各行
if(j==b[k]||j==b[k]-(i-k)||j==b[k]+(i-k)) // 1.求0 ~ i 行的 j列是否存在皇后
return false; // 2.求右斜方向是否存在皇后 便于思考可将 j == b[k] - (i-k)
return true; // 改为 j + i == b[k] + k
// 3.求左斜方向是否纯在皇后 j - i == b[k] - k
} // 注:1,2,3分别对应if语句中的判断条件顺序
}
void out(void)
{
printf("The no.%d answer is:\n",r);
for(i=0;i<8;i++)
printf("%2d",b[i]);
printf("\n");
}
void queen(int i,int j)
{
for(int h=j;h<8;h++) // 每行列的遍历
{
if(check(i,h)==1)
{
b[i]=h;
if(i<7)
queen(i+1,j); // 由于每行不能存在两个皇后,每找到一个正确位置,往下一行
else
{
r+=1; // 当满足8皇后 解r+1
out(); // 8皇后位置
}
}
}
}
int main()
{
queen(0,0); // 0,0为起点进行递归调用
return 0;
}
ps:如果对if条件判断还存在问题,动手画下矩阵,观察下对角线的规律。相信你会有收获的。