//八皇后问题
/*八皇后是一个 8*8 64个方块
要求:1:每一行只能放一个放一个皇后
2:每一列只能放一个皇后
3:左斜线(15),右斜线(15)上只能有一个皇后,并且放够8个皇后 算法:声明三个数组和一个栈,三个数组分别对应列,左斜线和右斜线,每行遍历一回,判断列,左右斜线是否有皇后,若无,则放,
若有,则,下一列,直到栈满结束,一组解,在栈中输出
*/
//非递归,只求一个解
#include<stdio.h>
#include<stdlib.h>
int col[8] = { 0,0,0,0,0,0,0,0};//查看那一列是否放皇后
int right[15] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };//每一条斜线
int left[15] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
int Q[8];
void EightQueen()
{
int top=-1, i=0, j=0;
while (top != 7)
{
//每一行的八列
for (; j < 8; j++)
{
if (!col[j] && !left[i + j] && !right[7 - i + j])
{
Q[++top] = j;
col[j] = left[i + j] = right[7 - i + j] = 1;
i++;
j = 0;
break;
}
}
if (j == 8)
{
i--;
col[j] = left[i + j] = right[7 - i + j] = 0;
j++;
}
}
}
void printEightQueen()
{
//输出一组解
for (int i = 0; i < 8; i++)
printf("%d,%d\t", i, Q[i]);
}
int main(void)
{
EightQueen();
printEightQueen();
return 0;
}