~~做了很多次
终于做出来了!!!!!!!!!!
解题思路:显然问题的关键在于如何判定某个皇后所在的行,列,斜线上是否有别的皇后
可以从矩阵的特点上找到规律,如果在同一行,则行号相同;如果在同一列上,则列好相同;如果同在/斜线上,则行列值之和相同;如果同在\斜线上,则行列值之差相同;下图可验证:
考虑每行有且仅有一个皇后,设一维数组a[1…8]表示皇后的放置:第i行皇后放在第j列,用a[i]=j来表示,即下标是行数,内容是列数。例如:a[3]=5就表示第3个皇后在第3行第5列上。
判断皇后是否安全,即检查同一列、同一对角线是否已有皇后,建立标志数组b[1…8]控制同一列只有一个皇后,若两皇后在同一对角线上,则其行列坐标之和或行列坐标之差相等,故亦可建立标志数组c[i…6]、d[-7…7]控制同一对角线上只能有一个皇后。
如果斜线不分方向,则同一斜线上两皇后的行号之差的绝对值与列号之差的绝对值相同。在这种方式下,要表示两个皇后i和j不在同一列或斜线上的条件可以描述为:(a[i]!=a[j])&&(abs(i-j)!=abs(a[i]-a[j])){i和j分别表示两个皇后的行号}
注意事项:注意题目就行
#include
int N,k,sum=0;
int flag1[200]={0};
int flag2[200]={0};
int flag3[20]={0};
int a[20]={0};
void DFS(int i)
{
if(i==N+1)
{
sum++;
if(sum<4)
{
for(int k=1;k<=N;k++)
printf("%d ",a[k]);
printf("\n");
}
}
else{
for(int j=1;j<=N;j++)
if(flag1[i+j]==0&&flag2[i-j+N]==0&&flag3[j]==0)
{
a[i]=j;
flag1[i+j]=1;flag2[i-j+N]=1;flag3[j]=1;
DFS(i+1);
flag1[i+j]=0;flag2[i-j+N]=0;flag3[j]=0;
}
}
}
int main()
{
scanf("%d",&N);
DFS(1);
printf("%d\n",sum);
}