分析:皇后与皇后不能在同一列同一个行,同一个对角线。对角线分主对角线,副对角线。
主对角线有2n-1条,副对角线有2n-1条。
设置棋盘源点为(1,1),故主对角线,副对角线范围为2~2n
分析完毕 约束条件已全部找到.
1 皇后不能在同一个行
2 皇后不能在同一个列
3 皇后同一个主对角线
4 皇后同一个副对角线
#include<stdio.h>
#include<math.h>
int a[100],b[100],c[100],d[100],N,o=0;
void tryfind(int k)
{
int j,l;
for(j=1;j<=N;j++)
{
if(b[j]==0&&c[k+j]==0&&d[k-j+N]==0)
{
a[k]=j;//放皇后
b[j]=1;//占领第j列
c[k+j]=1;//占领副对角线
d[k-j+N]=1;//占领主对角线
if(k<N)
{
tryfind(k+1);//放置下一个皇后
}
else
{
for(l=1;l<=N;l++)
{
printf("%d ",a[l]);
}
printf("\n");
o++;
}
b[j]=0;
c[k+j]=0;
d[k-j+N]=0;//回溯
}
}
}
int main ()
{
int i;
scanf("%d",&N);
for(i=1;i<=N;i++)
{
b[i]=0;
c[i]=0;c[i+N]=0;
d[i]=0;d[i+N]=0;//初始化
}
tryfind(1);
printf("%d",o);
}
运行结果如下