本文共 1130 字,大约阅读时间需要 3 分钟。
//这段代码不好理解的地方就是,在left和right数组上;
![](https://img-blog.csdn.net/20180404222316854?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0Z1dHVyZV9MTA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
//col数组表示皇后所在位置的列是否还有其他的皇后,这个很好理解;
//如果还是有问题可以给我留言,我看到会回复;
#includeint 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;}
//结果截屏: