//这段代码不好理解的地方就是,在left和right数组上;
//col数组表示皇后所在位置的列是否还有其他的皇后,这个很好理解;
//如果还是有问题可以给我留言,我看到会回复;
#include<stdio.h>
int col[8]={0}; //表示列,该列有元素则赋值为1;
int left[15]={0}; //表示偏左的斜线,斜线上有元素赋值为1;
int right[15]={0}; //表示偏右的斜线,斜线上有元素赋值为1;
int Q[8]; //存储每行皇后的位置,下标表示行坐标,所存的元素表示列坐标;
void Queen()
{
int top=-1,i=0,j=0; //用了栈的top指针性质,没有实质的创建一个栈;
while(top!=7) //找到一个皇后top++,直到找到八个皇后结束;
{
for(;j<8;j++)
{
if(!col[j]&&!left[i+j]&&!right[7+i-j]) //判断这个位置是否可以放置皇后;
{
Q[++top]=j; //将当前的列坐标赋给Q[++top],表示皇后已经放好;
col[j]=left[i+j]=right[7+i-j]=1; //放置好皇后的位置,该列以及两条斜线不能放置皇后;
i++; //进行下一行判断;
j=0; //每次都从0开始 判断;
break;
}
}
if(j==8) //若j==8(这一行都没有合适的位置)时还没有找到,相当于回溯;
{
i--; //回溯到上一行;
j=Q[top--]; //将top指向的元素赋给j并且top--(取出一个栈顶指针);
col[j]=left[i+j]=right[7+i-j]=0;
//这一列以及两条斜线清0,表示可以若进入下一行放置皇后不受该列以及链条斜线影响;
j++; //将j+1继续寻找这一行可以放置皇后的位置;
}
}
}
int main(void)
{
Queen();
//方法1输出;
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
if(j==Q[i])
printf("Q ");
else
printf("* ");
}
printf("\n");
}
//方法2输出;
printf("\n");
for(i=0;i<8;i++)
{
printf("第%d行的皇后位置为: %d\n",i,Q[i]);
}
return 0;
}
//结果截屏: