家人们随意看看吧~
闲的没事儿写的
原谅我不正经的注释
by Theophilus
#include<stdio.h>
#include<math.h>
int N=8; //八皇后问题
int X[9]; //为 N 个皇后对应横坐标位置 按顺序 【】内为行纵坐标顺序 其中数字为 N+1;
int num=0; //一共多少种可能性;
void Queen( int k ) // 其中 k 为第几行的皇后
{
int i,j,check;
//边界:
if(k>N)
{ // 递归之后 如果 行数超过了 N 则说明前面摆放的皇后没有问题, 即可打印对应皇后的位置 并继续将第一行的皇后位移计算新的可能性
num++; //可能性加一哦!
for(i=1;i<=N;i++)
{
printf("%d ",X[i]); //打印咯
}
printf("\n");
}
if( k<=N )
{
for(i=1;i<=N;i++) // 每一行的皇后逐列挨个试试 i 就是对应的列
{
check=1;
if(k==1) //当 这是第一行的皇后时 直接赋值i
{
X[k]=i;
Queen(k+1); //赋值之后直接可以开始计算下一行
}
if(k!=1) // 当 这不是第一行的皇后 需要进行 和之前所有的皇后 1.不同列 2.斜率不为零 若满足 则给 X[k] 赋值
{
for(j=1;j<k;j++) // j 是 k 之前的行 看看这个第 k 行的 i符不符合要求 不符合, i 继续加一
{
if( (X[j]==i) || (abs(k-j)==abs(i-X[j])) ) //条件啊!!满足了check就是 1 就能继续赋值
{
check=0;
}
}
if(check) // i满足了 在这个地方的条件 ,即可赋值给X[k]!!!!
{
X[k]=i;
Queen(k+1);
}
}
}
return ;
}
}
int main ()
{
Queen(1);
printf("总数量为:%d", num);
return 0;
}