解题思路:
分别用三个一维数组来记录列、45度、135度方向的情况,直接通过三个一维数组来判断是否发生冲突,无需搜索棋子控制范围,简单不少!!!
#include <stdio.h>
int QueenPlace[92][9]; //存放全部92种皇后棋子的摆放方法
int temp[9]; //存放当前解
int count = 0;
void putQueen(int); //求全部摆放方法的过程
bool range[9],line1[17],line2[17];//分别记录列,45度,135度方向上的情况
int main()
{
//freopen("in.txt","r",stdin);
int i,t,ithQueen;
scanf("%d",&t); //测试数据个数
for(i=0; i<=8; i++) //列初始化
range[i] = true;
for(i=0; i<17; i++)
line1[i] = line2[i] = true; //45度和135度方向初始化
putQueen(1); //从第一个棋子开始摆放
while(t--)
{
scanf("%d",&ithQueen); //输入第i个棋子
for(i=1; i<=8; i++)
printf("%d",QueenPlace[ithQueen-1][i]); //输出第i个棋子的皇后串
printf("\n");
}
return 0;
}
void putQueen(int i) //摆放函数
{
if(i>8) //如果最后一个棋子被摆放,则将临时解复制到QueenPlace中
{
for(int k= 1; k<9; k++)
QueenPlace[count][k] = temp[k];
count++;
}
for(int j=1; j<=8; j++) //逐个尝试将当前棋子放置在适当位置
{
if(range[j]&&line1[i+j]&&line2[i-j+9]) //如果与上级棋子不冲突
{
temp[i] = j; //摆放棋子
range[j]=line1[i+j]=line2[i-j+9]=false; //设置该皇后棋子的限制范围
putQueen(i+1); //摆放下一个棋子
range[j]=line1[i+j]=line2[i-j+9]=true; //解除限制
}
}
}