题干
大致思路
可以先放黑皇后再放白皇后,通过循环和递归实现各种情况判断。
具体解释和讲解见代码注释
#include<stdio.h>
int count=0;//方法计数
int table[10][10];//棋盘
int blackcol[8],whitecol[8];//黑皇后每一行的列数统计,白皇后每一行的列数统计
int check(int line,int col[])//检查放进棋盘中的皇后是否和之前的皇后在同一行,同一列,同一对角线
{
int temp=0,i;
int flag=1;
for(i=0;i<line;i++)
{
if(col[line]==col[i]||col[line]-col[i]==line-i||col[line]-col[i]==i-line)//后两个可以当成是两个皇后所在点连线的斜率,1或-1
{
flag=0;
}
}
return flag;
}
void white(int line,int n)
{
int i;
if(line==n)//当放完所有行时,count加1
{
count++;
}
else
{
for(i=0;i<n;i++)//循环每一行
{
if(table[line][i]==1&&blackcol[line]!=i)//判断是否可放且没有黑皇后
{
whitecol[line]=i;//记录列数
if(check(line,whitecol))
{
white(line+1,n); //递归继续放下一行,当不成立时返回
}
}
}
}
}
void black(int line,int n)//大致同上
{
int i;
if(line==n)
{
return white(0,n);
}
else
{
for(i=0;i<n;i++)
{
if(table[line][i]==1)
{
blackcol[line]=i;
if(check(line,blackcol))
{
black(line+1,n);
}
}
}
}
}
int main()
{
int n;
scanf("%d",&n);
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&table[i][j]);
}
}
black(0,n);
printf("%d",count);
return 0;
}