在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1 8 5 0
Sample Output
1 92 10
思路:
https://blog.csdn.net/daoshen1314/article/details/87353727
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
//行固定,列在变
int a[15]; //a[col]=row 表示第col列第row行放置皇后
int sum[15]; //表示i皇后的方案数
int cnt;
//参数row表示要在第row行放置皇后
void dfs(int row,int n)
{
if(n+1==row)//表示一种方案结束
{
cnt++;
return;
}
for(int i=1;i<=n;i++)
{
if(a[i]) continue;//如果第i列已经放置皇后,就不能再放置
a[i]=row; //假设第i列能放
int ok=1;
for(int j=1;j<=n;j++) //判断第i列能不能放置
{
if(i==j) continue; //本身不需要再比较
if(!a[j]) continue; //如果第j列没有放置皇后, 则对i列无影响
if(a[j]-a[i]==j-i||a[j]-a[i]==i-j) //两个对角线不允许放置两个皇后
ok=0;
break;
}
}
if(ok) dfs(row+1,n);//可以把皇后放下一行
a[i]=0; //要把此列清空,为了能判断下一种方案
}
}
int main()
{
for(int i=1;i<=10;i++)
{
memset(a,0,sizeof(a));
cnt=0;
dfs(1,i);
sum[i]=cnt;
}
int n;
while(~scanf("%d",&n)&&n)
cout<<sum[n]<<endl;
return 0;
}